【python爬虫专项(14)】正则表达式在爬虫中的应用

遗留问题

之前对于豆瓣读书信息的采集中,特别是要求二(如下的阴影区信息),直接将可以用的信息采集了下来,而带有链接的字段都是当做空白字符进行处理的,如下
在这里插入图片描述
当时创建的字典搜集数据:(比如作者名称,译者字段都是空白)
在这里插入图片描述

问题解决

下面以《肖申克救赎》中要求二中数据的获取为例,进行正则表达式的应用
在这里插入图片描述
准备好前期的工作和网页分析,这里就直接给出代码和输出结果,如下
在这里插入图片描述
从结果输出可以看出,作者和译者之间存在着换行符和空格字符,这时候就要进行提取的细化,sublime里面对于字符自动进行处理了,比如‘\n’直接表示成换行,因此要进行字符的匹配,需要在spyder中进行字符的处理

import requests 
from bs4 import BeautifulSoup
import re

dic_heders = {
       'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
    }

dic_cookies = {}
cookies = 'll="108296"; bid=b9z-Z1JF8wQ; _vwo_uuid_v2=DDF408830197B90007427EFEAB67DF985|b500ed9e7e3b5f6efec01c709b7000c3; douban-fav-remind=1; __yadk_uid=2D7qqvQghjfgVOD0jdPUlybUNa2MBZbz; gr_user_id=5943e535-83de-4105-b840-65b7a0cc92e1; dbcl2="150296873:VHh1cXhumGU"; push_noty_num=0; push_doumail_num=0; __utmv=30149280.15029; __gads=ID=dcc053bfe97d2b3c:T=1579101910:S=ALNI_Ma5JEn6w7PLu-iTttZOFRZbG4sHCw; ct=y; Hm_lvt_cfafef0aa0076ffb1a7838fd772f844d=1579102240; __utmz=81379588.1579138975.5.5.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmz=30149280.1579162528.9.8.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; ck=csBn; _pk_ref.100001.3ac3=%5B%22%22%2C%22%22%2C1581081161%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DNq2xYeTOYsYNs1a4LeFRmxqwD_0zDOBN253fDrX-5wRdwrQqUpYGFSmifESD4TLN%26wd%3D%26eqid%3De7868ab7001090b7000000035e1fbf95%22%5D; _pk_ses.100001.3ac3=*; __utma=30149280.195590675.1570957615.1581050101.1581081161.16; __utmc=30149280; __utma=81379588.834351582.1571800818.1581050101.1581081161.12; __utmc=81379588; ap_v=0,6.0; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03=b6a046c7-15eb-4e77-bc26-3a7af29e68b1; gr_cs1_b6a046c7-15eb-4e77-bc26-3a7af29e68b1=user_id%3A1; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03_b6a046c7-15eb-4e77-bc26-3a7af29e68b1=true; _pk_id.100001.3ac3=6ec264aefc5132a2.1571800818.12.1581082472.1581050101.; __utmb=30149280.7.10.1581081161; __utmb=81379588.7.10.1581081161'
cookies_lst = cookies.split("; ")

for i in cookies_lst:
	dic_cookies[i.split("=")[0]] = i.split("=")[1]
    
def get_data(url):
    
    r = requests.get(url,headers = dic_heders, cookies = dic_cookies)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['书名'] = soup.find(id="wrapper").h1.text
    infos = soup.find(id="info").text
    s = re.sub(r' +',"",infos)
    return(dic,s)

get_data('https://book.douban.com/subject/1829226/')

输出的结果如下:
在这里插入图片描述
接下来就是对于字符串s的处理了(如何把字符串中的信息转化成为字典信息?),可以借鉴一下cookies的处理方式(cookies里面的都是用“=”连接的,这里是用“:”进行连接的),需要注意cookies中处理字符串有明显的“; ”分割,但是字符串s并没有,所以只使用单纯的split方法并不能完成想要的结果,因此可以借用正则表达式的功能,将每个信息匹配出来,然后放在列表里面,由于不能使用split,那就还有一种就是re.findall()方法了

lst = re.findall(r'\n.+:.+',s)

运行此代码输出的结果为:
在这里插入图片描述
这时候列表中的每个元素之间就有明显的统一特征,就可以借鉴cookies的处理方式,

def get_data(url):
    
    r = requests.get(url,headers = dic_heders, cookies = dic_cookies)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['书名'] = soup.find(id="wrapper").h1.text.replace("\n","")
    infos = soup.find(id="info").text
    s = re.sub(r' +',"",infos)
    lst = re.findall(r'\n.+:.+',s)
    for i in lst:
        i = i.replace("\n","").replace("\xa0","")
        dic[i.split(":")[0]] =i.split(":")[1]
    return(dic)
get_data('https://book.douban.com/subject/1829226/')  

输出的结果为:(简单字段的数据提取完毕)
在这里插入图片描述
接着是对作者和译者的信息提取以及定价字段数据的处理,也是难点所在,这时候对于特定字段的处理re.search()方法就派上用场了,首先看一下定价字段的问题,如下
在这里插入图片描述
先处理定价的字段:只获取里面的数值(数值的前边和后边都可能有字符,而且中间的.也是需要匹配的)

dj = re.search(r"定价:\D*([.\d]+)\D*",s)
    if dj:
        dic['定价'] = dj.group(1)
print(dic)

输出的结果如下:(数值字段匹配成功)
在这里插入图片描述
然后处理作者,一样是使用re.search()方法,这里要注意当初在写配模式时候在"."中进行的功能介绍。如下
在这里插入图片描述

zz = re.search(r"\n作者:([\s\S]+)\n出版社",s)
    if zz:
        dic['作者'] = zz.group(1).replace("\xa0","").replace("\n","")
print(dic)

输出的结果如下:
在这里插入图片描述
同样的方式来处理译者:

yz = re.search(r"译者:([\s\S]+)\n出版年",s)
    if yz:
        dic['译者'] = yz.group(1).replace("\n","")
print(dic)

输出的结果如下:
在这里插入图片描述
对比一下,原网页的要求二中的信息,如下(加上标题共12项,上面的字典里包含的数据也是12项)
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值