脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python网络爬虫基于selenium爬取斗鱼直播信息

python网络爬虫基于selenium爬取斗鱼直播信息

2022-11-02 09:20馆主阿牛 Python

目前是直播行业的一个爆发期,由于国家对直播行业进行整顿和规范,现在整个直播行业也在稳固发展。随着互联网和网络直播市场的快速发展,相信未来还有广阔的发展前景。今天用selenium爬取一下斗鱼直播信息将代码分享给大家

一、本文使用的第三方包和工具

python 3.8  

谷歌浏览器

selenium(3.141.0)(pip install selenium == 3.141.0)注意4.0系列和3.0系列方法不同

浏览器驱动(和你的浏览器版本对应)

二、selenium的介绍和浏览器驱动的安装

1.selenium的介绍

    selenium是一款web自动化测试工具,可以很方便地模拟真实用户对浏览器进行操作,它支持各种主流浏览器:IE、Chrome、Firefox、Safari、Opera等。你可以使用selenium做web测试或者爬虫,自动抢票、自动下单也可以用selenium来做。

2.浏览器驱动的安装

   网上方法很多,友友们自行搜索,在这里提一点注意事项:本文用的是谷歌浏览器,浏览器驱动要对应谷歌的哦,注意浏览器驱动与你的浏览器版本相对应,这里给出谷歌浏览器驱动的下载地址,友友们按照自己浏览器的版本对应现在即可

http://chromedriver.storage.googleapis.com/index.html

下载完成后注意配置环境变量哦,不配置也行,不配置就要在代码中写上你的Chromedriver.exe文件的路径或者不写路径将你的Chromedriver.exe和py文件放到同一目录下也可以哦

三、代码思路分析

进入斗鱼官网,点到直播,下面的在线直播信息就是我们需要爬取的​

可以看到有标题,类型,姓名,以及热度,我们爬取这四个字段就行

然后滑到底部,这里的下一页是我们控制爬取页数的​

 注意:当我们进入页面时,虽然有滚动条,但所有直播信息已经加载好,并不是通过滑动然后Ajax加载的,所以在代码中并不需要写滑动,直接提取就可以拿到整个页面的数据。

1.解析数据的函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#解析数据的函数
   def parse(self):
       #强制等待两秒,等待页面数据加载完毕
       sleep(2)
       li_list = self.bro.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li')
       #print(len(li_list))
       data_list = []
       for li in li_list:
           dic_data = {}
           dic_data['title'] = li.find_element_by_xpath('./div/a/div[2]/div[1]/h3').text
           dic_data['name'] = li.find_element_by_xpath('./div/a/div[2]/div[2]/h2/div').text
           dic_data['art_type'] = li.find_element_by_xpath('./div/a/div[2]/div[1]/span').text
           dic_data['hot'] = li.find_element_by_xpath('./div/a/div[2]/div[2]/span').text
           data_list.append(dic_data)
       return data_list

2.保存数据的函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#解析数据的函数
   def parse(self):
       #强制等待两秒,等待页面数据加载完毕
       sleep(2)
       li_list = self.bro.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li')
       #print(len(li_list))
       data_list = []
       for li in li_list:
           dic_data = {}
           dic_data['title'] = li.find_element_by_xpath('./div/a/div[2]/div[1]/h3').text
           dic_data['name'] = li.find_element_by_xpath('./div/a/div[2]/div[2]/h2/div').text
           dic_data['art_type'] = li.find_element_by_xpath('./div/a/div[2]/div[1]/span').text
           dic_data['hot'] = li.find_element_by_xpath('./div/a/div[2]/div[2]/span').text
           data_list.append(dic_data)
       return data_list

(1)保存为txt文本

?
1
2
3
4
5
6
7
8
#保存数据的函数
    def save_data(self,data_list,i):
        #在当前目录下将数据存为txt文件
        with open('./douyu.txt','w',encoding='utf-8') as fp:
            for data in data_list:
                data = str(data)
                fp.write(data+'\n')
            print("第%d页保存完成!" % i)

(2)保存为json文件

?
1
2
3
4
5
6
7
#保存数据的函数
    def save_data(self,data_list,i):
        with open('./douyu.json','w',encoding='utf-8') as fp:
             #里面有中文,所以注意ensure_ascii=False
             data = json.dumps(data_list,ensure_ascii=False)
             fp.write(data)
             print("第%d页保存完成!" % i)

3.主函数设计

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#主函数
    def run(self):
        #输入要爬取的页数,如果输入负整数,转化成她的绝对值
        page_num = abs(int(input("请输入你要爬取的页数:")))
        #初始化页数为1
        i = 1
        #判断输入的数是否为整数
        if isinstance(page_num,int):
            #实例化浏览器对象
            self.bro = webdriver.Chrome(executable_path='../../可执行文件/chromedriver.exe')
            # chromedriver.exe如果已添加到环境变量,可省略executable_path='../../可执行文件/chromedriver.exe'
            self.bro.get(self.url)
            while i <= page_num:
                #调用解析函数
                data_list = self.parse()
                #调用保存函数
                self.save_data(data_list,i)
                try:
                    #定位包含“下一页”字段的按钮并点击
                    button = self.bro.find_element_by_xpath('//span[contains(text(),"下一页")]')
                    button.click()
                    i += 1
                except:
                    break
            self.bro.quit()
        else:
            print("输入格式错误!")

四、完整代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from selenium import webdriver
from time import sleep
import json
#创建一个类
class Douyu():
    def __init__(self):
        self.url = 'https://www.douyu.com/directory/all'
    #解析数据的函数
    def parse(self):
        #强制等待两秒,等待页面数据加载完毕
        sleep(2)
        li_list = self.bro.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li')
        #print(len(li_list))
        data_list = []
        for li in li_list:
            dic_data = {}
            dic_data['title'] = li.find_element_by_xpath('./div/a/div[2]/div[1]/h3').text
            dic_data['name'] = li.find_element_by_xpath('./div/a/div[2]/div[2]/h2/div').text
            dic_data['art_type'] = li.find_element_by_xpath('./div/a/div[2]/div[1]/span').text
            dic_data['hot'] = li.find_element_by_xpath('./div/a/div[2]/div[2]/span').text
            data_list.append(dic_data)
        return data_list
    #保存数据的函数
    def save_data(self,data_list,i):
        #在当前目录下将数据存为txt文件
        with open('./douyu.txt','w',encoding='utf-8') as fp:
            for data in data_list:
                data = str(data)
                fp.write(data+'\n')
            print("第%d页保存完成!" % i)
        # json文件的存法
        # with open('./douyu.json','w',encoding='utf-8') as fp:
        # 里面有中文,所以注意ensure_ascii=False
        #     data = json.dumps(data_list,ensure_ascii=False)
        #     fp.write(data)
        #     print("第%d页保存完成!" % i)
    #主函数
    def run(self):
        #输入要爬取的页数,如果输入负整数,转化成她的绝对值
        page_num = abs(int(input("请输入你要爬取的页数:")))
        #初始化页数为1
        i = 1
        #判断输入的数是否为整数
        if isinstance(page_num,int):
            #实例化浏览器对象
            self.bro = webdriver.Chrome(executable_path='../../可执行文件/chromedriver.exe')
            # chromedriver.exe如果已添加到环境变量,可省略executable_path='../../可执行文件/chromedriver.exe'
 
            self.bro.get(self.url)
            while i <= page_num:
                #调用解析函数
                data_list = self.parse()
                #调用保存函数
                self.save_data(data_list,i)
                try:
                    #定位包含“下一页”字段的按钮并点击
                    button = self.bro.find_element_by_xpath('//span[contains(text(),"下一页")]')
                    button.click()
                    i += 1
                except:
                    break
            self.bro.quit()
        else:
            print("输入格式错误!")
if __name__ == '__main__':
    douyu = Douyu()
    douyu.run()

总结

   本文是为了练习selenium而写的,由于一个页面有120条数据,所以采集效率较低,感兴趣的小伙伴们可以试一试requests库写,爬取速度更快哦!希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_57421630/article/details/122510369

延伸 · 阅读

精彩推荐
  • PythonPython数据分析matplotlib折线图案例处理

    Python数据分析matplotlib折线图案例处理

    这篇文章主要介绍了Python数据分析matplotlib折线图案例处理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下...

    阿呆小记9072022-08-16
  • PythonWindows下PyCharm配置Anaconda环境(超详细教程)

    Windows下PyCharm配置Anaconda环境(超详细教程)

    这篇文章主要介绍了Windows下PyCharm配置Anaconda环境,本文给大家分享一篇超详细教程,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有...

    四四十六5992020-07-31
  • PythonCentOS下使用yum安装python-pip失败的完美解决方法

    CentOS下使用yum安装python-pip失败的完美解决方法

    这篇文章主要介绍了CentOS下使用yum安装python-pip失败的完美解决方法,需要的朋友可以参考下...

    wosicuanqi7392020-12-02
  • Pythonpython生成excel的实例代码

    python生成excel的实例代码

    这篇文章主要为大家详细介绍了python生成excel的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    努力哥9592020-12-16
  • Python看完 Python3.10 的新特性,我决定仍不更新

    看完 Python3.10 的新特性,我决定仍不更新

    Python3.10 在 2021 年的 10 月 3 号发布,目前已经过去 1 个月了,关于它的新特性相信大家已经有所耳闻,不过我决定仍然不更新,目前我在用的版本是 Pytho...

    Python七号4922021-11-04
  • PythonPython根据过滤器拆分列表

    Python根据过滤器拆分列表

    这篇文章主要介绍了Python根据过滤器拆分列表,利用Python代码实现代通过过滤器拆分列表的功能。文章围绕其相关资料展开详细内容,需要的朋友可以参考一...

    Felix9672022-02-28
  • PythonPython 判断是否为质数或素数的实例

    Python 判断是否为质数或素数的实例

    下面小编就为大家带来一篇Python 判断是否为质数或素数的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    欠你一颗糖2952020-12-14
  • Python用scikit-learn和pandas学习线性回归的方法

    用scikit-learn和pandas学习线性回归的方法

    这篇文章主要介绍了用scikit-learn和pandas学习线性回归的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    刘建平Pinard9552021-07-17