使用selenium自动爬取斗鱼直播平台的所有房间信息
使用selenium自动爬取斗鱼直播平台的所有房间信息
文章目录
- 使用selenium自动爬取斗鱼直播平台的所有房间信息
- 使用selenium实现动态页面模拟点击
- 什么是selenium?
- selenium 介绍
- 分析翻页操作:
- 详情页面数据的爬取:
- 保存数据的函数:
使用selenium实现动态页面模拟点击
什么是selenium?
selenium 介绍
selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比 QTP 有诸多有点:
免费,也不用再为破解 QTP 而大伤脑筋小巧,对于不同的语言它只是一个包而已,而 QTP 需要下载安装1个多 G 的程序。这也是最重要的一点,不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以通过 selenium 完成自动化测试,而 QTP 只支持 VBS支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器的执行,相当于分发机的功能
今天我们就用selenium实现斗鱼直播平台的房间信息的爬取:
先确认网址:
这是网址:https://www.douyu.com/directory/all
图3
图4
分析翻页操作:
发现所有房间的信息都是保存在一个无序列表中的li中,所以我们可以先获取一个装有li的element对象的列表,然后在对每个element逐一操作
分析斗鱼的翻页,有一个下一页按钮,是个li,class="dy-Pagination-item-custom"
,但是当烦到最后一页的时候,class="dy-Pagination-disabled dy-Pagination-next"
,所以我们要想利用selenium模拟点击这个按钮,我们应该利用
get_elements_by_xpath()这个函数,这样到最后一页就获取不到了,就可以终止程序了。而用elements的原因是当到最后一页的时候获取不到的话,element会报错
然后还是通用的套路:发送请求获取响应、提取数据和下一页的元素、保存数据、点击下一页的元素循环…
图5:
反爬措施:
需要用time.sleep()函数强制等待页面加载完再获取元素,否则报错,睡几秒就看你的网速了
所以我们要导入这个模块:
import time
下面开始代码的编写:
导入的模块:
import time
import json
from selenium import webdriver
初始化函数的编写:
def __init__(self):self.start_rul = 'https://www.douyu.com/directory/all'self.driver = webdriver.Chrome()
这个样子就可以自动打开浏览器了,这个我们打开的是Chrome谷歌浏览器
详情页面数据的爬取:
def get_content_list(self):time.sleep(10) # 强制等待10秒,否则可能报错li_list = self.driver.find_elements_by_xpath('//ul[@class="layout-Cover-list"]/li')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"]').textitem['root_category'] = li.find_element_by_xpath('.//span[@class="DyListCover-zone"]').textitem['author_name'] = li.find_element_by_class_name('DyListCover-user').textitem['watch_num'] = li.find_element_by_class_name('DyListCover-hot').textcontent_list.append(item)print(item) # 打印每次获取到的直播房间的信息# 获取下一页的元素,为了防止没有报错,这里用elements,翻到最后一页一定就没有了,返回一个列表next_url = self.driver.find_elements_by_xpath('//li[@class=" dy-Pagination-next"]')next_url = next_url[0] if len(next_url) > 0 else Nonereturn content_list, next_url
保存数据的函数:
def save_content_list(self, content_list):with open("douyu.txt", "a",encoding='utf-8') as f:for content in content_list:json.dump(content, f, ensure_ascii=False, indent=2)f.write("\n")print("保存数据成功")f.close()
运行程序的主函数:
def run(self): # 实现主要逻辑# 1.start_url# 2.发送请求,获取响应self.driver.maximize_window()self.driver.get(self.start_rul)# 3.提取数据,提取下一页的元素content_list, next_url = self.get_content_list()# 4.保存数据self.save_content_list(content_list)# 4.点击下一页元素,循环while next_url is not None:next_url.click()content_list, next_url = self.get_content_list()self.save_content_list(content_list)
运行整个程序的主函数:
if __name__ == '__main__':douban = DouyuSpider()douban.run()
这样子我们程序的代码就完成了:
完整的代码:
import time
import json
from selenium import webdriver
class DouyuSpider(object):def __init__(self):self.start_rul = 'https://www.douyu.com/directory/all'self.driver = webdriver.Chrome()def get_content_list(self):time.sleep(10) # 强制等待10秒,否则可能报错li_list = self.driver.find_elements_by_xpath('//ul[@class="layout-Cover-list"]/li')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"]').textitem['root_category'] = li.find_element_by_xpath('.//span[@class="DyListCover-zone"]').textitem['author_name'] = li.find_element_by_class_name('DyListCover-user').textitem['watch_num'] = li.find_element_by_class_name('DyListCover-hot').textcontent_list.append(item)print(item) # 打印每次获取到的直播房间的信息# 获取下一页的元素,为了防止没有报错,这里用elements,翻到最后一页一定就没有了,返回一个列表next_url = self.driver.find_elements_by_xpath('//li[@class=" dy-Pagination-next"]')next_url = next_url[0] if len(next_url) > 0 else Nonereturn content_list, next_urldef save_content_list(self, content_list):with open("douyu.txt", "a",encoding='utf-8') as f:for content in content_list:json.dump(content, f, ensure_ascii=False, indent=2)f.write("\n")print("保存数据成功")f.close()def run(self): # 实现主要逻辑# 1.start_url# 2.发送请求,获取响应self.driver.maximize_window()self.driver.get(self.start_rul)# 3.提取数据,提取下一页的元素content_list, next_url = self.get_content_list()# 4.保存数据self.save_content_list(content_list)# 4.点击下一页元素,循环while next_url is not None:next_url.click()content_list, next_url = self.get_content_list()self.save_content_list(content_list)
if __name__ == '__main__':douban = DouyuSpider()douban.run()
运行的效果:
图1
图2
使用selenium自动爬取斗鱼直播平台的所有房间信息相关推荐
- 爬取斗鱼直播平台的所有房间信息
1.首先确定数据的位置 每个房间的数据都在id=live-list-contentbox的ul中 2. 实现翻页和控制程序结束 selenium中通过点击就可以实现翻页,观察存在下一页和不存在下一页时 ...
- selenium抓取斗鱼直播平台数据
https://www.cnblogs.com/xinyangsdut/p/7617691.html 程序说明: 抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. ...
- python抓取直播源 并更新_Python爬虫实例(二)使用selenium抓取斗鱼直播平台数据...
程序说明:抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. 过程分析: 进入平台首页,来到页面底部点击下一页,发现url地址没有发生变化,这样的话再使用urlli ...
- 使用 Selenium 爬取斗鱼直播数据(2019最新)
环境:Win10 需要安装 Chromedriver Chromedriver下载(需对应浏览器的版本) 这些是我最近在学 selenium 模块爬取得斗鱼直播数据,以下爬取的是 图片.详情地址.标 ...
- Python爬取斗鱼直播网站信息
一.需求 爬取斗鱼直播网站信息,如直播名字.主播名字.热度.图片和房间网址,将这些数据保存到csv文件中,并单独创建文件夹保存图片. 斗鱼直播网址:https://www.douyu.com/g_LO ...
- 使用scrapy爬取斗鱼直播间信息
目录 1. 谷歌抓包工具的使用 1.1 打开Chrome开发者工具的方法 1.2 开发者工具的结构 1.3 network模块 2. 使用谷歌抓包工具抓取斗鱼数据 3. 使用scrapy爬取斗鱼直播间 ...
- Python爬取斗鱼直播信息
一.需求 爬取斗鱼直播网站信息,如直播名字.主播名字.热度.图片和房间网址,将这些数据保存到csv文件中,并单独创建文件夹保存图片. 斗鱼直播网址:https://www.douyu.com/g_LO ...
- 实时爬取斗鱼直播时的弹幕消息
最近想爬取实时消息,上网查了下,所以爬取斗鱼直播的弹幕消息做了下练习,这个开源的代码有很多,但是具体是怎么爬取到的还是要仔细地研究下.想爬取斗鱼的弹幕消息,按照常用的做法是打开网页用抓包工具抓包,但是 ...
- selenium框架爬取p2p问题平台信息,需加载点击页面的。
@TOC selenium框架爬取p2p问题平台信息 # -*- coding: utf-8 -*- """ Created on Tue Dec 10 07:03:57 ...
最新文章
- 树莓派 raspberry安全关机命令重启命令
- 【HDU】4706 Children's Day(模拟)
- 重磅官宣:评职称将不做论文数量硬性要求!职称改革任务总体完成
- 在批处理中运行.sql文件
- java swing 页面布局方式_javaswing酷炫界面
- java 服务器所在盘符_JAVA获取文件本身所在的磁盘位置 | 学步园
- apache目录 vscode_[PHP] php, apache, VS Code安装与配置
- [指数型生成函数专练]chocolate,红色病毒问题,排列组合,字串数
- springboot整合activiti报错[processes/]不存在解决方案
- linux定时监控端口并重新启动shell脚本命令
- 表格下拉_【职场充电】要说制作一个漂亮的表格,高手都爱WPS
- nginx 接收报文_Nginx代理缓存功能
- POJ2940 HDU1489 UVA11054 Wine Trading in Gergovia【Ad Hoc】
- L1-055 谁是赢家 (10 分)—团体程序设计天梯赛
- VisualBox 克隆CentOS 7.6 后,ip,源,禁止root远程登录,主机,防火墙,ssh密钥登录
- webstorm主题
- 基于深度区域的金字塔神经网络用于铝合金表面各种缺陷的自动检测和多分类—论文笔记
- 赢在CSDN——谈谈程序员为什么要持续学习和创作?对CSDN的期待、个人创作的规划
- [教程] 如何复活一个完全死机的联发科设备
- 罗振宇2021跨年演讲5:为什么你要建成自己的“黄鹤楼”?
热门文章
- Npm配置全局安装插件目录以及命令用法扩展
- margin: 0 auto;的作用
- Unity内文件夹详解
- 波菲那契数列公式_斐波那契数列为什么那么重要,所有关于数学的书几乎都会提到?...
- FBI如何费尽心力破解了苹果,以及,iOS系统究竟有多安全? | 硬创公开课
- HKEY_CURRENT_USER下在服务中注册自启动exe
- 刚破了潘金莲的身份信息(图片文字识别),win7、win10实测可用(免费下载)
- cache line大小
- 全国企业信用信息 网站
- opencv实现camshift算法,以及代码详解