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双向链表实现实例代码
Nov 21 Python
python操作ssh实现服务器日志下载的方法
Jun 03 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
Jan 23 Python
python使用knn实现特征向量分类
Dec 26 Python
python写日志文件操作类与应用示例
Jul 01 Python
python英语单词测试小程序代码实例
Sep 09 Python
python pygame实现球球大作战
Nov 25 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
如何使用Python调整图像大小
Sep 26 Python
python可视化之颜色映射详解
Sep 15 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 Ajax实现页面无刷新发表评论
2007/01/02 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
简述Python中的进程、线程、协程
2016/03/18 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
Python try except finally资源回收的实现
2021/01/25 Python
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
大专生自荐信
2013/10/04 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
运动会演讲稿300字
2014/08/25 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
瘦西湖导游词
2015/02/03 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers