python selenium爬取斗鱼所有直播房间信息过程详解


Posted in Python onAugust 09, 2019

还是分析一下大体的流程:

首先还是Chrome浏览器抓包分析元素,这是网址:https://www.douyu.com/directory/all

发现所有房间的信息都是保存在一个无序列表中的li中,所以我们可以先获取一个装有li的element对象的列表,然后在对每个element逐一操作

分析斗鱼的翻页,有一个下一页按钮,是个li,class="dy-Pagination-item-custom" ,但是当烦到最后一页的时候,class="dy-Pagination-disabled dy-Pagination-next",所以我们要想利用selenium模拟点击这个按钮,我们应该利用

get_elements_by_xpath()这个函数,这样到最后一页就获取不到了,就可以终止程序了。而用elements的原因是当到最后一页的时候获取不到的话,element会报错

然后还是通用的套路:发送请求获取响应、提取数据和下一页的元素、保存数据、点击下一页的元素循环......

遇到的两个坑:

需要用time.sleep()函数强制等待页面加载完再获取元素,否则报错,睡几秒就看你的网速了

xpath定位的时候,网页上有的类如这样:class=" abc"或者class="abc " ,前面或后面有空格的,xpath处理的时候也必须有空格,否则获取不到

代码实现:

import time
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"]').text
      item['root_category'] = li.find_element_by_xpath('.//span[@class="DyListCover-zone"]').text
      item['author_name'] = li.find_element_by_class_name('DyListCover-user').text
      item['watch_num'] = li.find_element_by_class_name('DyListCover-hot').text
      content_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 None
    return content_list, next_url
  def save_content_list(self, content_list):
    pass # 保存数据这里就不再做演示

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的阳历转阴历(农历)算法
Apr 25 Python
使用python加密自己的密码
Aug 04 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
Django分页功能的实现代码详解
Jul 29 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
python文件及目录操作代码汇总
Jul 08 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 #Python
基于python二叉树的构造和打印例子
Aug 09 #Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 #Python
Django ORM 自定义 char 类型字段解析
Aug 09 #Python
解决使用export_graphviz可视化树报错的问题
Aug 09 #Python
Django中自定义admin Xadmin的实现代码
Aug 09 #Python
python输出决策树图形的例子
Aug 09 #Python
You might like
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
python获取多线程及子线程的返回值
2017/11/15 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
python for和else语句趣谈
2019/07/02 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
自我鉴定书范文
2013/10/02 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
教代会开幕词
2015/01/28 职场文书
老人与海读书笔记
2015/06/26 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers