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操作MySQL简单实现方法
Jan 26 Python
浅谈python新手中常见的疑惑及解答
Jun 14 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
python实现屏保计时器的示例代码
Aug 08 Python
Django保护敏感信息的方法示例
May 09 Python
keras用auc做metrics以及早停实例
Jul 02 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 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
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
详解js异步文件加载器
2016/01/24 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
内容编辑个人求职信
2013/12/10 职场文书
三方协议书范本
2014/04/22 职场文书
广播节目策划方案
2014/05/23 职场文书
中药学专业求职信
2014/05/31 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
党员发展大会主持词
2015/07/03 职场文书
六五普法学习心得体会
2016/01/21 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书