首先,我们先对整个爬取框架进行分析,这与利用xpath爬取网页信息类似。通过requests获得网页信息,然后转换成text格式,通过findall方法,用正则表达式进行查找需要的信息,然后对采集到的信息进行过滤,拿到最后需要的信息。最后对信息进行序列化得到了我们想要的信息。
下面的是代码。
import re
import requests
Headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 Edg/89.0.774.48"
}
url="https://so.gushiwen.cn/shiwens/default.aspx?page={}"
def spider():
# parse_page(url)
for p in range(1,4):
url1=url.format(p)
parse_page(url1)
def parse_page(url):
resp=requests.get(url,Headers)
text=resp.text
titles=re.findall(r'<div class="cont">.*?<b>(.*?)</b>',text,re.DOTALL)
# print(titles)
authors = re.findall(r'<p class="source">.*?<a.*?>(.*?)</a>',text,re.DOTALL)
dynastys = re.findall(r'<p class="source">.*?<a.*?>.*?<a.*?>(.*?)</a>', text, re.DOTALL)
contents = re.findall(r'<div class="contson" .*?>(.*?)</div>', text, re.DOTALL)
# print(authors,dynastys,contents,titles)
contentslist=[]
for content in contents:
x=re.sub(r'<.*?>',"",content)
contentslist.append(x.strip())
#zip序列解包
poems=[]
for v in zip(titles,authors,dynastys,contentslist):
title,author,dynasty,content=v
poem={"title":title,"author":author,"dynasty":dynasty,"content":content}
poems.append(poem)
print(poems)
if __name__ == '__main__':
spider()
在这其中主要运用了正则表达式进行信息的爬取,对于正则表达式大家如果有什么不懂的,可以参阅一下下面的链接。
python正则表达式详解
在上述代码中主要用到了python标准库中的re库,无需下载,直接导入。用到了其中的findall方法进行查找,re.DOTALL函数使元字符“.”匹配任意字符,包括换行符,re.sub方法将字符串中所有与pat参数匹配的项用repl参数代替替换,返回新字符串,用zip函数对多个可迭代对象压缩到一起,进行序列解包。
对于正则表达式这一块,我觉得还是得好好背背基础知识,对于一些网页源代码不正规的网页爬取用正则表达式比较好。