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升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python实现子类调用父类的方法
Nov 10 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
windows下ipython的安装与使用详解
Oct 20 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
Python堆排序原理与实现方法详解
May 11 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
Django模板获取field的verbose_name实例
May 19 Python
Python中的Cookie模块如何使用
Jun 04 Python
详解python中的闭包
Sep 07 Python
python实现扫雷游戏的示例
Oct 20 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/08/08 PHP
php Smarty 字符比较代码
2011/02/27 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
详谈js原型继承的一些问题
2017/09/06 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
js实现随机点名程序
2020/09/17 Javascript
node 版本切换的实现
2020/02/02 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
师范毕业生个人求职信
2013/12/09 职场文书
死亡证明书样本说明
2014/10/18 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
植物园观后感
2015/06/11 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB