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每次处理固定个数的字符的方法总结
Jan 29 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
python读取中文txt文本的方法
Apr 12 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
详解【python】str与json类型转换
Apr 29 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
Python字符串的修改方法实例
Dec 19 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python 实现的IP 存活扫描脚本
Dec 10 Python
python实现杨辉三角的几种方法代码实例
Mar 02 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中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
php文件上传类完整实例
2016/05/14 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
newxtree.js代码
2007/03/13 Javascript
document.documentElement && document.documentElement.scrollTop
2007/12/01 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
详解Python爬虫的基本写法
2016/01/08 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
基于python实现学生信息管理系统
2019/11/22 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
安全检查验收制度
2014/01/12 职场文书
人资专员岗位职责
2014/04/04 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
网吧员工管理制度
2015/08/05 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
Python 图片添加美颜效果
2022/04/28 Python