zoukankan      html  css  js  c++  java
  • 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所示的程序逻辑框架图

    clip_image002

    图3-1 程序逻辑框架图


    (二)爬虫程序调试过程BUG描述(截图)

    clip_image002[8]

    图3-1   爬虫程序BUG描述①


    clip_image002[10]

    图3-2 爬虫程序BUG描述②


    四、项目结果

    clip_image002[14]


    五、项目心得

       关于本例实验心得可总结如下:

    1、 当程序运行结果提示错误为:ModuleNotFoundError: No module named 'lxml',最好的解决方法是:首先排除是否lxml是否安装,再检查lxml是否被导入。本实验中,是由于工程项目为能成功导入lxml,解决方法如图5-1所示,在“Project Interperter”中选择python安装目录,即可。

    clip_image002[16]

    图5-1 错误解决过程


    2、 当出现如图4-6的爬虫程序BUG描述时,可以确定为phantomjs没有设置环境变量,或者编程程序没有成功加载环境,后者的解决方法只需重新启动JetBrains PyCharm 2018.3.2即可,对于前者可在系统中设置环境即可


    3、 新版selenium不支持phantomJS的解决方法:使用Chrome+headless或Firefox+headless,headless:无头参数,如图5-2所示:

    clip_image002[18]

    图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("	热度数",hot,"    	主播名:",name,"                   	主播类型:",type,"          	房间名:",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)
  • 相关阅读:
    【转】点集 凸包
    【转】Word中使用Endnote很卡解决方案
    【转】一个程序员的面试经验之谈
    【转】 std list/vector sort 排序
    std::numeric_limits<int>::max() error C2589: '(' : illegal token on right side of '::' 解决办法
    【转】Log4cpp 封装
    【转】 log4cpp 的使用
    遍历目录 删除目录中包含指定字符的文件和文件夹
    mysql主从复制架构
    mysql分区功能详细介绍,以及实例
  • 原文地址:https://www.cnblogs.com/Raodi/p/11187437.html
Copyright © 2011-2022 走看看