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的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
简析Python的闭包和装饰器
Feb 26 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
浅析python继承与多重继承
Sep 13 Python
python实现五子棋小程序
Jun 18 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
Python PO设计模式的具体使用
Aug 16 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
python中count函数知识点浅析
Dec 17 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编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
python 深度学习中的4种激活函数
2020/09/18 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
消防安全管理制度
2014/02/01 职场文书
我的理想演讲稿
2014/04/30 职场文书
人事专员岗位说明书
2014/07/29 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
学生病假条范文
2015/08/17 职场文书
小学语文教学反思范文
2016/03/03 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
MySQL数据库事务的四大特性
2022/04/20 MySQL