基于selenium的斗鱼直播房间详细信息自动化爬虫

from selenium import webdriver
import time
#导入 ActionChains 类
from selenium.webdriver import ActionChains
import json
import re
import requests

class DouYuSpider():

    def __init__(self):
        #初始化google浏览器驱动对象和起始请求url并发起请求
        self.driver = webdriver.Chrome("D:/chromedriver_win32/chromedriver.exe")
        self.start_url = "https://www.douyu.com/directory/all"
        self.driver.get(self.start_url)


    def get_content(self):
        #将浏览器窗口设置为最大
        self.driver.maximize_window()
        #睡眠2秒等待加载
        time.sleep(2)
        #获取当前页的全部li元素(一个li内包含一个直播房间的信息)
        li_list = self.driver.find_elements_by_xpath("//div[@class='layout-Module-container layout-Cover ListContent']/ul[@class='layout-Cover-list']/li")
        #遍历全部li获取房间详细信息
        for index, li in enumerate(li_list):
            if index % 4 == 0:
                #当索引号为4的整数倍时移动一次鼠标,这是由于分析发现房间的图片url只有在浏览器窗口可见的区域才能获取到,故每获取一行4个房间信息时将鼠标移动一次以使当前欲获取的房间信息显现在窗口可视区域
                ActionChains(self.driver).move_to_element(li).perform()
            #以字典形式保存房间详细信息
            item = {}
            item["title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").text
            item["classical"] = li.find_element_by_class_name("DyListCover-zone").text
            item["name"] = li.find_element_by_class_name("DyListCover-user").text
            item["audience_num"] = li.find_element_by_class_name("DyListCover-hot").text
            item["img_src"] = li.find_element_by_xpath(".//div[@class='LazyLoad is-visible DyImg DyListCover-pic']/img").get_attribute("src")
            #调用保存方法将数据以json格式写入本地文件
            self.save_content(item)


    def save_img(self, title, url):
        #保存图片到本地,将title的特殊符号剔除(文件名不得包含特殊符号)
        title = re.sub(r"[^\u4E00-\u9FFF]", "", title)
        file_name = title + ".png"
        with open("./data/douyu_img/" + file_name, "wb") as fp:
            fp.write(requests.get(url).content)


    def save_content(self, data):
        #保存数据到本地json文件
        with open("./data/douyu.json", "a", encoding="utf-8") as fp:
            json.dump(data, fp, ensure_ascii=False)
            fp.write("\n")
            self.save_img(data["title"], data["img_src"])
            print(data["title"] + "写入成功...")


    def run(self):
        #首次获取数据
        self.get_content()

        #存在下一页时点击下一页继续抓取数据
        while self.driver.find_element_by_class_name("dy-Pagination-next"):
            self.driver.find_element_by_class_name("dy-Pagination-next").click()
            self.get_content()


dys = DouYuSpider()
dys.run()

爬取json文件如下:
在这里插入图片描述
保存图片如下:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值