Python爬虫实现模拟点击动态页面


Posted in Python onMarch 05, 2020

动态页面的模拟点击:

以斗鱼直播为例:http://www.douyu.com/directory/all

爬取每页的房间名、直播类型、主播名称、在线人数等数据,然后模拟点击下一页,继续爬取

代码如下

#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
 
"""
动态页面的模拟点击:
  模拟点击斗鱼直播:http://www.douyu.com/directory/all
  爬取每页房间名、直播类型、主播名称、在线人数等数据,然后模拟点击下一页,继续爬取
"""
 
from selenium import webdriver
import json
 
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象,executable_path:指定PhantomJS位置
driver = webdriver.PhantomJS(executable_path = r"D:\Program Files\phantomjs\bin\phantomjs")
from bs4 import BeautifulSoup
 
class DouyuSpider(object):
  """
  爬虫类
  """
  def __init__(self):
    self.url = "http://www.douyu.com/directory/all/"
    self.driver = webdriver.PhantomJS()
    self.file_name = open("douyu.json", "w", encoding = "utf-8")
 
  def run(self):
    """
    爬虫开始工作
    """
    self.driver.get(self.url)
    # 循环处理每一页,直至最后一页
    page = 1
    start_flag = True
    while True:
      # 等待3秒,防止访问过于频繁
      self.driver.implicitly_wait(3)
      print("正在处理第" + page + "页......")
      page += 1
      # 解析
      soup = BeautifulSoup(self.driver.page_source, "lxml")
      # 在线直播部分
      online_live = soup.find_all('ul', {'id': 'live-list-contentbox'})[0]
      # 房间列表
      live_list = online_live.find_all('li')
      # 处理每一个房间
      for live in live_list:
        # 房间名、直播类型、主播名称、在线人数
        # 房间名
        home_name = live.find_all('h3', {'class': 'ellipsis'})[0].get_text().strip()
        # 直播类型
        live_type = live.find_all('span', {'class': 'tag ellipsis'})[0].get_text().strip()
        # 主播名称
        anchor_name = live.find_all('span', {'class': 'dy-name ellipsis fl'})[0].get_text().strip()
        # 在线人数
        online_num = live.find_all('span', {'class' :'dy-num fr'})[0].get_text().strip()
        # print(home_name, live_type, anchor_name, online_num)
        item = {}
        item["房间名"] = home_name
        item["直播类型"] = live_type
        item["主播名称"] = anchor_name
        item["在线人数"] = online_num
        if start_flag:
          start_flag = False
          content = "[\n" + json.dumps(item)
        else:
          content = ",\n" + json.dumps(item)
        self.file_name.write(content)
      # page_source.find()未找到内容则返回-1
      if self.driver.page_source.find('shark-pager-disable-next') != -1:
        # 已到最后一页
        break
      # 模拟点击下一页
      self.driver.find_element_by_class_name('shark-pager-next').click()
 
    # 爬虫结束前关闭文件
    self.file_name.write("\n]")
    self.file_name.close()
if __name__ == '__main__':
  douyu = DouyuSpider()
  douyu.run()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的super()方法使用简介
Aug 14 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python 命令行传入参数实现解析
Aug 30 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
Python求两个字符串最长公共子序列代码实例
Mar 05 Python
Python如何输出百分比
Jul 31 Python
python GUI计算器的实现
Oct 09 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
python实现图片横向和纵向拼接
Mar 05 #Python
基于Python生成个性二维码过程详解
Mar 05 #Python
Python callable内置函数原理解析
Mar 05 #Python
python实现图像拼接
Mar 05 #Python
Python求两个字符串最长公共子序列代码实例
Mar 05 #Python
Python操作MongoDb数据库流程详解
Mar 05 #Python
Python文字截图识别OCR工具实例解析
Mar 05 #Python
You might like
PHP新手入门学习方法
2011/05/08 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
不错的JS中变量相关的细节分析
2007/08/13 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
对于Python的Django框架部署的一些建议
2015/04/09 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python实现超市商品销售管理系统
2019/10/25 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
应届生.NET方向面试题
2015/05/23 面试题
少先队入队活动方案
2014/02/08 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
索赔员岗位职责
2015/02/15 职场文书
护林员个人总结
2015/03/04 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js