博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scrapy项目 - 实现斗鱼直播网站信息爬取的爬虫设计
阅读量:5249 次
发布时间:2019-06-14

本文共 3897 字,大约阅读时间需要 12 分钟。



      要求编写的程序可爬取斗鱼直播网站上的直播信息,如:房间数,直播类别和人气等。熟悉掌握基本的网页和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 webdriverfrom lxml import etreeimport  twistedimport  scrapyfrom openpyxl import Workbookimport timeclass 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 itemif __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)

转载于:https://www.cnblogs.com/Raodi/p/11187437.html

你可能感兴趣的文章
python习题:unittest参数化-数据从文件或excel中读取
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>
网站产品设计
查看>>
代理ARP
查看>>
go 学习笔记(4) ---项目结构
查看>>
java中静态代码块的用法 static用法详解
查看>>
Java线程面试题
查看>>
Paper Reading: Relation Networks for Object Detection
查看>>
day22 01 初识面向对象----简单的人狗大战小游戏
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
熟用TableView
查看>>
Java大数——a^b + b^a
查看>>
poj 3164 最小树形图(朱刘算法)
查看>>
服务器内存泄露 , 重启后恢复问题解决方案
查看>>