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中stdout输出不缓存的设置方法
May 29 Python
Windows下安装python2.7及科学计算套装
Mar 05 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
python 对象和json互相转换方法
Mar 22 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
用Python selenium实现淘宝抢单机器人
Jun 18 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/02/16 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
Python selenium如何设置等待时间
2016/09/15 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
python 利用toapi库自动生成api
2020/10/19 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
物业工作计划书
2014/01/10 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
松材线虫病防治方案
2014/06/15 职场文书
监考失职检讨书
2015/01/26 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
为什么RedisCluster设计成16384个槽
2021/09/25 Redis