利用正则表达式爬取中国古诗文网

首先,我们先对整个爬取框架进行分析,这与利用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函数对多个可迭代对象压缩到一起,进行序列解包。

对于正则表达式这一块,我觉得还是得好好背背基础知识,对于一些网页源代码不正规的网页爬取用正则表达式比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值