欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

程序员文章站 2024-03-25 18:38:04
...

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

基础: Python 爬虫 之 Selenium、webdriver 的安装,以及模拟打开操作浏览器的简单实现

 

目录

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

一、简单介绍

二、知识点

三、注意事项

四、效果预览

五、实现步骤

六、关键代码


 

一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。

Selenium [1]  是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

 

二、知识点

1、selenium 进行网页数据请求获取,并翻页;

2、xpath 方式解析的数据、并json形式保存到本地;

3、类 与 函数的封装(面向对象);

4、time.sleep() 的使用;

 

三、注意事项

1、time.sleep() 合理使用,适当休眠,等待数据加载,不然可能来不及获取数据

2、selenium 使用 xpath 查找内容时,在查找后的结果中在查找,注意有时候要加上必要的 "." 开始

例如:li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']")

3、selenium 使用了模拟打开浏览器的方式获取数据,所以数据需要加载,或取速度不是很快,且可能获取不到数据,请注意,结合 time.sleep() 合理使用

4、为了判断是否获取正确,可以必要添加打印信息检验

 

四、效果预览

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

五、实现步骤

简单分析实现原理:

1)首先使用 "https://www.douyu.com/directory/all" 获取首页网页信息,然后查找对应信息,并自动查找下一页按钮点击翻页

2)视频列表查找格式:self.driver.find_elements_by_xpath("//ul[@class='layout-Cover-list']/li") ;

3)房间的信息查找格式如下:

item["room_img"] = li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']").get_attribute("src")

item["room_title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").get_attribute("title")

item["room_owner"] = li.find_element_by_xpath(".//h2[@class='DyListCover-user']").text

item["room_zone"] = li.find_element_by_xpath(".//span[@class='DyListCover-zone']").text

item["room_watch_hot"] = li.find_element_by_xpath(".//span[@class='DyListCover-hot']").text

4)下一页查找的格式:next_url = self.driver.find_elements_by_xpath("//li[@class=' dy-Pagination-next']")

判断是否找到下一页按钮:next_url = next_url[0] if len(next_url) > 0 else None

点击方式:next_url.click()

5)信息保存方式:

with open("./douyuallinfo.txt", "a", encoding="utf-8") as f:

    json.dump(content_list, f, indent=4, ensure_ascii=False)

 

具体实现:

1、打开网页 https://www.douyu.com/directory/all ,查看元素(浏览器不同,可能不叫查看元素),进行分析,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

2、分析得到,视频列表在 <ul class="layout-Cover-list">...</ul> 里面,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

3、分析得到,视频相关图片信息 <img class="DyImg-content is-normal" src="...">...,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

4、分析得到,视频相关标题信息 <h3 class="DyListCover-intro" title="...">...,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

5、分析得到,视频相关主题信息 <span class="DyListCover-zone">...,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

6、分析得到,视频相关房主信息 <h2 class="DyListCover-user">...,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

7、分析得到,视频相关房间观热度信息 <span class="DyListCover-hot">...,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

8、分析得到,下一页按钮 <li class=" dy-Pagination-next">...,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

9、分析得到,最后一页的下一页按钮为 <li class="dy-Pagination-disabled dy-Pagination-next">... 与前面的不一致,就可以做为区别是否到最后一页了,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

10、根据以上开始编写代码,打开 Pycharm,新建工程,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

11、新建一个 python 文件,并设置为 run ,如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

12、通过以上分析,实现相关逻辑代码,运行脚本效果见预览效果,结果如下图

Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

 

六、关键代码

import json
from selenium import webdriver
import time


class DouyuSpider:      # 获取斗鱼全视频相关信息
    def __init__(self):
        # 斗鱼全视频网址
        self.start_url = "https://www.douyu.com/directory/all"
        # 启动火狐浏览器
        self.driver = webdriver.Firefox()

    def get_content_list(self):
        """
            获取视频列表信息
        :return: 返回视频列表信息,和下一下按钮
        """
        li_list = self.driver.find_elements_by_xpath("//ul[@class='layout-Cover-list']/li")
        print(li_list)
        content_list = []
        for li in li_list:
            item = {}
            item["room_img"] = li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']").get_attribute("src")
            item["room_title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").get_attribute("title")
            item["room_owner"] = li.find_element_by_xpath(".//h2[@class='DyListCover-user']").text
            item["room_zone"] = li.find_element_by_xpath(".//span[@class='DyListCover-zone']").text
            item["room_watch_hot"] = li.find_element_by_xpath(".//span[@class='DyListCover-hot']").text
            print(item)
            content_list.append(item)
        # 获取下一页按钮,判断是否存在
        next_url = self.driver.find_elements_by_xpath("//li[@class=' dy-Pagination-next']")
        next_url = next_url[0] if len(next_url) > 0 else None
        return content_list, next_url

    def save_content_list(self, content_list):
        """
        保存信息
        :param content_list: 保存内容
        """
        with open("./douyuallinfo.txt", "a", encoding="utf-8") as f:    # 打开文件
            json.dump(content_list, f, indent=4, ensure_ascii=False)    # json 格式保存

    def run(self):
        # 1、 start_url 获取初始 html
        self.driver.get(self.start_url)
        # 休眠 3 s 等待数据加载,不然可能来不及获取数据
        time.sleep(3)
        # 2、 提取当前数据,并获取下一页数据
        content_list, next_url = self.get_content_list()
        # 3、 保存数据
        self.save_content_list(content_list)
        # 4、 循环获取下一页数据
        while next_url is not None:
            next_url.click()
            # 休眠 3 s 等待数据加载
            time.sleep(3)
            # 2、 提取当前数据,并获取下一页数据
            content_list, next_url = self.get_content_list()
            # 3、 保存数据
            self.save_content_list(content_list)

        # 退出火狐浏览器
        self.driver.quit()


if __name__ == "__main__":
    douyu = DouyuSpider()
    douyu.run()