python3爬虫学习之re实战

基于前面正则表达式的学习,上一篇学习中的实践代码,实战项目,爬取古诗文

上代码

import re
import requests

def parse_page(url):
    headers = {
        "User-Agent" : "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N)"
                       " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Mobile Safari/537.36"
    }
    reponse = requests.get(url , headers)
    text = reponse.text
    titles = re.findall(r'<div class="cont">.*?<a.*?><b>(.*?)</b>.*?</a>' , text , re.S)#.无法匹配换行符,re.S可以让.匹配
    dys = re.findall(r'<div class="cont">.*?<p class="source">.*?<a.*?>(.*?)</a>' , text , re.S)
    authors = re.findall(r'<div class="cont">.*?<p class="source">.*?<a.*?>.*?</a>.*?<a.*?>(.*?)</a>',text,re.S)
    f_verses = re.findall(r'<div class="contson".*?>(.*?)</div>',text,re.S)
    verses = []
    for verse in f_verses:
        ver = re.sub(r"\\n|<br />|<p>|</p>" ,"" ,verse)
        verses.append(ver.strip())
    poems = []
    for value in zip(titles,dys,authors,verses):
        title,dy,author,vers  = value
        poem = {
            "标题" : title,
            "朝代" : dy,
            "作者" : author,
            "古诗" : vers
        }
        poems.append(poem)
    print("*"*50)
    for poem in poems:
        for value in poem.values():
            print(value)
        print("*"*50)


def main():
    page = int(input("请输入爬取页数: "))
    for x in range(1,page+1):
        url = "https://www.gushiwen.org/default_%s.aspx" % x
        parse_page(url)

if __name__ == '__main__':
    main()

我们预设了自定义爬取的页数。

我们定义了main函数向parse_page函数传递url解析

我们定义了dys存储朝代,authors存储作者,f_verses存储未经处理的诗文

我们之前了解到"."无法匹配换行符,这里的re.S则解决了这个问题

(.*?)匹配我们想要的内容

遍历f_versers处理未经杂乱的古诗文

用sub函数,替换标签,换行符,

用strip去除多余空白符

用字典存储作者朝代古诗,用列表存储字典,放部分运行结果

运行时,输入多页爬取,确定可以爬取多页,避免出现bug

猜你喜欢

转载自blog.csdn.net/s_kangkang_A/article/details/89049992