基于前面正则表达式的学习,上一篇学习中的实践代码,实战项目,爬取古诗文
上代码
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