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 用户登录验证的小例子
Mar 06 Python
python创建和使用字典实例详解
Nov 01 Python
Python 自动补全(vim)
Nov 30 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
scrapy爬虫完整实例
Jan 25 Python
python SMTP实现发送带附件电子邮件
May 22 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
keras.utils.to_categorical和one hot格式解析
Jul 02 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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的5个入手程序
2006/11/23 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
javascript常用的设计模式
2017/02/09 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
Python strip lstrip rstrip使用方法
2008/09/06 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
numpy数组拼接简单示例
2017/12/15 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
Python sys模块常用方法解析
2020/02/20 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
造型师求职自荐信
2013/09/27 职场文书
机械绘图员岗位职责
2013/11/19 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server