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 16 Python
Python中多线程及程序锁浅析
Jan 21 Python
python实现超简单端口转发的方法
Mar 13 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
transform python环境快速配置方法
Sep 27 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
pytorch 归一化与反归一化实例
Dec 31 Python
使用Pytorch来拟合函数方式
Jan 14 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
基于python3生成标签云代码解析
Feb 18 Python
Python基于traceback模块获取异常信息
Jul 23 Python
Python如何定义有可选参数的元类
Jul 31 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
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
区域销售经理职责
2013/12/22 职场文书
鉴定评语大全
2014/05/05 职场文书
环保倡议书50字
2014/05/15 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
家庭教育的心得体会
2014/09/01 职场文书
个人思想政治总结
2015/03/05 职场文书
教师考核鉴定意见
2015/06/05 职场文书
小数乘法教学反思
2016/02/22 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python