找回密码
 会员注册
查看: 35|回复: 0

Python爬虫:教你四种姿势解析提取数据

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-9 09:10:35 | 显示全部楼层 |阅读模式
一、分析网页以经典的爬取豆瓣电影Top250信息为例。每条电影信息在olclass为grid_view下的li标签里,获取到所有li标签的内容,然后遍历,就可以从中提取出每一条电影的信息。翻页查看url变化规律:第1页:https://movie.douban.com/top250?start=0&filter=第2页:https://movie.douban.com/top250?start=25&filter=第3页:https://movie.douban.com/top250?start=50&filter=第10页:https://movie.douban.com/top250?start=225&filter=start参数控制翻页,start=25*(page-1)本文分别利用正则表达式、BeautifulSoup、PyQuery、Xpath来解析提取数据,并将豆瓣电影Top250信息保存到本地。二、正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便地检查一个字符串是否与某种模式匹配,常用于数据清洗,也可以顺便用于爬虫,从网页源代码文本中匹配出我们想要的数据。re.findall12在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意:match和search是匹配一次;而findall匹配所有。语法格式为:findall(string[,pos[,endpos]])string:待匹配的字符串;pos:可选参数,指定字符串的起始位置,默认为0;endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。示例如下:importretext="""'''doc=pq(html)print(doc('li'))12345678910111213141516结果如下:firstitem12345首先引入pyquery这个对象,取别名为pq,然后定义了一个长HTML字符串,并将其当作参数传递给pyquery类,这样就成功完成了初始化。接下来,将初始化的对象传入CSS选择器。在这个实例中,我们传入li节点,这样就可以选择所有的li节点。代码如下:#-*-coding:UTF-8-*-"""@Author:叶庭云@公众号:修炼Python@CSDN:https://yetingyun.blog.csdn.net/"""importrequestsfrompyqueryimportPyQueryaspqimportopenpyxlfromfake_useragentimportUserAgentimportlogging#日志输出的基本配置logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s:%(message)s')#随机产生请求头ua=UserAgent(verify_ssl=False,path='fake_useragent.json')wb=openpyxl.Workbook()#创建工作簿对象sheet=wb.active#获取工作簿的活动表sheet.title="movie"#工作簿重命名sheet.append(["排名","电影名","导演和主演","上映时间","上映地区","电影类型","评分","评价人数","引言"])defrandom_ua():headers={"Accept-Encoding":"gzip","Connection":"keep-alive","User-Agent":ua.random}returnheadersdefscrape_html(url):resp=requests.get(url,headers=random_ua())#print(resp.status_code,type(resp.status_code))ifresp.status_code==200:returnresp.textelse:logging.info('请求网页失败')defget_data(page):globalrankurl=f"https://movie.douban.com/top250?start={25*page}&filter="html_text=scrape_html(url)doc=pq(html_text)lis=doc('.grid_viewli')forliinlis.items():name=li('.hdaspan:first-child').text()temp=li('.bdp:first-child').text().split('\n')director_actor=temp[0]temp1=temp[1].rsplit('/',2)time_,area,genres=[item.strip()foritemintemp1]quote=li('.quotespan').text()rating_score=li('.star.rating_num').text()rating_num=li('.starspan:last-child').text()sheet.append([rank,name,director_actor,time_,area,genres,rating_score,rating_num,quote])logging.info([rank,name,director_actor,time_,area,genres,rating_score,rating_num,quote])rank+=1if__name__=='__main__':rank=1foriinrange(10):get_data(i)wb.save(filename='movie_info3.xlsx')1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162结果如下:五、XpathXpath是一个非常好用的解析方法,同时也作为爬虫学习的基础,在后面的**Selenium**以及**Scrapy**框架中也会涉及到这部分知识。首先我们使用lxml的etree库,然后利用etree.HTML初始化,然后我们将其打印出来。其中,这里体现了lxml的一个非常实用的功能就是自动修正html代码,大家应该注意到了,最后一个li标签,其实我把尾标签删掉了,是不闭合的。不过,lxml因为继承了libxml2的特性,具有自动修正HTML代码的功能,通过xpath表达式可以提取标签里的内容,如下所示:fromlxmlimportetreetext=''''''html=etree.HTML(text)result=etree.tostring(html)result1=html.xpath('//li/@class')#xpath表达式print(result1)print(result)123456789101112131415161718['item-0','item-1','item-inactive','item-1','item-0']12345678910111213代码如下:#-*-coding:UTF-8-*-"""@Author:叶庭云@公众号:修炼Python@CSDN:https://yetingyun.blog.csdn.net/"""importrequestsfromlxmlimportetreeimportopenpyxlfromfake_useragentimportUserAgentimportlogging#日志输出的基本配置logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s:%(message)s')#随机产生请求头ua=UserAgent(verify_ssl=False,path='fake_useragent.json')wb=openpyxl.Workbook()#创建工作簿对象sheet=wb.active#获取工作簿的活动表sheet.title="movie"#工作簿重命名sheet.append(["排名","电影名","导演和主演","上映时间","上映地区","电影类型","评分","评价人数","引言"])defrandom_ua():headers={"Accept-Encoding":"gzip","Connection":"keep-alive","User-Agent":ua.random}returnheadersdefscrape_html(url):resp=requests.get(url,headers=random_ua())#print(resp.status_code,type(resp.status_code))ifresp.status_code==200:returnresp.textelse:logging.info('请求网页失败')defget_data(page):globalrankurl=f"https://movie.douban.com/top250?start={25*page}&filter="html=etree.HTML(scrape_html(url))lis=html.xpath('//ol[@class="grid_view"]/li')#每个li标签里有每部电影的基本信息forliinlis:name=li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]director_actor=li.xpath('.//div[@class="bd"]/p/text()')[0].strip()info=li.xpath('.//div[@class="bd"]/p/text()')[1].strip()#按"/"切割成列表_info=info.split("/")#得到上映时间上映地区电影类型信息去除两端多余空格time_,area,genres=_info[0].strip(),_info[1].strip(),_info[2].strip()#print(time,area,genres)rating_score=li.xpath('.//div[@class="star"]/span[2]/text()')[0]rating_num=li.xpath('.//div[@class="star"]/span[4]/text()')[0]quote=li.xpath('.//p[@class="quote"]/span/text()')#有些电影信息没有一句话引言加条件判断防止报错iflen(quote)==0:quote=Noneelse:quote=quote[0]sheet.append([rank,name,director_actor,time_,area,genres,rating_score,rating_num,quote])logging.info([rank,name,director_actor,time_,area,genres,rating_score,rating_num,quote])rank+=1if__name__=='__main__':rank=1foriinrange(10):get_data(i)wb.save(filename='movie_info1.xlsx')12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970结果如下:六、总结爬取网页数据用正则表达式的话,可以直接从网页源代码文本中匹配,但出错率较高,且熟悉正则表达式的使用也比较难,需要经常翻阅文档。实际爬取数据大多基于HTML结构的Web页面,网页节点较多,各种层级关系。可以考虑使用Xpath解析器、BeautifulSoup解析器、PyQueryCSS解析器抽取结构化数据,使用正则表达式抽取非结构化数据。Xpath:可在XML中查找信息;支持HTML的查找;通过元素和属性进行导航,查找效率很高。在学习Selenium以及Scrapy框架中也都会用到。BeautifulSoup:依赖于lxml的解析库,也可以从HTML或XML文件中提取数据。PyQuery:Python仿照jQuery严格实现,可以直接解析DOM节点的结构,并通过DOM节点的一些属性快速进行内容提取。对于爬取网页结构简单的Web页面,有些代码是可以复用的,如下所示:fromfake_useragentimportUserAgent#随机产生请求头ua=UserAgent(verify_ssl=False,path='fake_useragent.json')defrandom_ua():headers={"Accept-Encoding":"gzip","User-Agent":ua.random}returnheaders123456789101112伪装请求头,并可以随机切换,封装为函数,便于复用。defscrape_html(url):resp=requests.get(url,headers=random_ua())#print(resp.status_code,type(resp.status_code))#print(resp.text)ifresp.status_code==200:returnresp.textelse:logging.info('请求网页失败')123456789请求网页,返回状态码为200说明能正常请求,并返回网页源代码文本。▍学习资源推荐零基础Python学习资源介绍👉Python学习路线汇总👈Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(学习教程文末领取哈)👉Python必备开发工具👈温馨提示:篇幅有限,已打包文件夹,获取方式在:文末👉Python学习视频600合集👈观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。👉实战案例👈光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。👉100道Python练习题👈检查学习结果。👉面试刷题👈资料领取上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料”即可领取。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 23:19 , Processed in 0.490047 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表