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("\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)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,关于将Scrapy-Redis分布式爬虫爬取的数据写入MySQL数据库,您可以按照以下步骤操作: 1. 在pip中安装PyMySQL库:pip install pymysql 2. 在Scrapy项目的settings.py文件中添加数据库配置信息: ``` MYSQL_HOST = 'localhost' # 你的mysql地址 MYSQL_DBNAME = 'test' # 数据库名字,请修改 MYSQL_USER = 'root' # 数据库账号,请修改 MYSQL_PASSWORD = '123456' # 数据库密码,请修改 MYSQL_PORT = 3306 # 数据库端口号 ``` 3. 在items.py文件中定义需要存储的字段,例如: ``` import scrapy class NewsItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() date = scrapy.Field() ``` 4. 在pipelines.py文件中编写MySQL存储Pipeline: ``` import pymysql class MySQLPipeline(object): def __init__(self, mysql_host, mysql_port, mysql_user, mysql_password, mysql_dbname): self.host = mysql_host self.port = mysql_port self.user = mysql_user self.password = mysql_password self.dbname = mysql_dbname @classmethod def from_crawler(cls, crawler): return cls( mysql_host=crawler.settings.get('MYSQL_HOST'), mysql_port=crawler.settings.get('MYSQL_PORT'), mysql_user=crawler.settings.get('MYSQL_USER'), mysql_password=crawler.settings.get('MYSQL_PASSWORD'), mysql_dbname=crawler.settings.get('MYSQL_DBNAME') ) def open_spider(self, spider): self.db = pymysql.connect( host=self.host, port=self.port, user=self.user, password=self.password, db=self.dbname ) self.cursor = self.db.cursor() def close_spider(self, spider): self.db.close() def process_item(self, item, spider): data = dict(item) keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) table = 'news' # 数据库表名,请修改 sql = f'INSERT INTO {table} ({keys}) VALUES ({values})' self.cursor.execute(sql, tuple(data.values())) self.db.commit() return item ``` 4. 在settings.py文件中启用Pipeline: ``` ITEM_PIPELINES = { 'myproject.pipelines.MySQLPipeline': 300 } ``` 这样,当Scrapy爬取到数据时,就会通过MySQLPipeline将数据写入MySQL数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值