Scrapy项目 - 实现斗鱼直播网站信息爬取的爬虫设计
要求编写的程序可爬取斗鱼直播网站上的直播信息,如:房间数,直播类别和人气等。熟悉掌握基本的网页和url分析,同时能灵活使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析。
一、项目分析
1. 网页分析
斗鱼直播网站按直播类型明显在网页上划分区域,同时在每一种类型区域中,视频标签框都将具有相同的class名称,如:直播房间的class名称为:ellipsis,直播类型class为:tag ellipsis,主播名称为:dy-name ellipsis fl,人气活跃度为:dy-num fr,这使得本实验的进行更为便捷。
这里使用xpath_helper_2_0_2工具,对网页中的class进行分析并转换成相应的xpath表达式,如下:
ellipsis为:
//div[@id='live-list-content']//h3[@class='ellipsis']/text()
dy-num fr为:
//div[@id='live-list-content']//span[@class='dy-num fr']/text()
dy-name ellipsis fl为:
//div[@id='live-list-content']//span[@class='dy-name ellipsis fl']/text()
tag ellipsis为:
//div[@id='live-list-content']//span[@class='tag ellipsis']/text()
2. url分析
这里的网页加载可由self.driver调用get()方法完成,同时在网页模块判断的时候,可由其调用find_element_by_class_name('shark-pager-next').click()方法串,自动完成下一页的模拟翻转。
同时可调用page_source.find('shark-pager-disable-next')方法进行判断是否为模块中的最后一页。
二、项目工具
Python 3.7.1 、 JetBrains PyCharm 2018.3.2
三、项目过程
(一)使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析,绘制如图3-1所示的程序逻辑框架图
图3-1 程序逻辑框架图
(二)爬虫程序调试过程BUG描述(截图)
图3-2 爬虫程序BUG描述②
四、项目结果
五、项目心得
关于本例实验心得可总结如下:
1、 当程序运行结果提示错误为:ModuleNotFoundError: No module named 'lxml',最好的解决方法是:首先排除是否lxml是否安装,再检查lxml是否被导入。本实验中,是由于工程项目为能成功导入lxml,解决方法如图5-1所示,在“Project Interperter”中选择python安装目录,即可。
图5-1 错误解决过程
2、 当出现如图4-6的爬虫程序BUG描述时,可以确定为phantomjs没有设置环境变量,或者编程程序没有成功加载环境,后者的解决方法只需重新启动JetBrains PyCharm 2018.3.2即可,对于前者可在系统中设置环境即可
3、 新版selenium不支持phantomJS的解决方法:使用Chrome+headless或Firefox+headless,headless:无头参数,如图5-2所示:
图5-2 解决方法
六、项目源码
doyu.py
from selenium import webdriver from lxml import etree import twisted import scrapy from openpyxl import Workbook import time class Douyu(object): def __init__(self): self.driver = webdriver.PhantomJS() def start(self): self.driver.get('https://www.douyu.com/directory/all') room_sum=0 host_sum=0 type_sum=0 while True: time.sleep(2) content=etree.HTML(self.driver.page_source) roomnames=content.xpath("//div[@id='live-list-content']//h3[@class='ellipsis']/text()") hots=content.xpath("//div[@id='live-list-content']//span[@class='dy-num fr']/text()") names=content.xpath("//div[@id='live-list-content']//span[@class='dy-name ellipsis fl']/text()") types=content.xpath("//div[@id='live-list-content']//span[@class='tag ellipsis']/text()") for roomname,hot,name,type in zip(roomnames,hots,names,types): roomname=roomname.strip() print("\t热度数",hot," \t主播名:",name," \t主播类型:",type," \t房间名:",roomname) room_sum+=1 if hot[-1]=='万': hot=hot[:-1] hot=int(float(hot)*10000) host_sum+=hot #host_sum=host_sum+hot else: host_sum+=int(hot) if type=='绝地求生': type_sum+=1 else: a=0 a+=1 ret=self.driver.page_source.find('shark-pager-disable-next') if ret>0: break else: # 非最后一页,点击下一页 self.driver.find_element_by_class_name('shark-pager-next').click() print('房间总数:',room_sum) print('热度总数:', host_sum) print('主播名总数:', room_sum) print('绝地求生主播总数:',type_sum) class DoubanPipeline(object): wb = Workbook() ws = wb.active # 设置表头 ws.append(['标题', '评分']) def process_item(self, item): # 添加数据 line = [item['title'], item['star']] self.ws.append(line) # 按行添加 self.wb.save('douban.xlsx') return item if __name__=="__main__": douyu=Douyu() douyu.start() #//div[@id='live-list-content']//h3[@class='ellipsis']/text() #//div[@id='live-list-content']//span[@class='dy-num fr']/text() #ret= driver.page_source.find('shark-pager-disable-next') #print(ret)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?