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写的Tkinter程序屏幕居中方法
Mar 10 Python
深入理解python多进程编程
Jun 12 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
python 项目目录结构设置
Feb 14 Python
python中如何设置代码自动提示
Jul 15 Python
python实现磁盘日志清理的示例
Nov 05 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 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查询域名状态whois的类
2006/11/25 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
Yii核心验证器api详解
2016/11/23 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Python操作qml对象过程详解
2019/09/26 Python
python圣诞树编写实例详解
2020/02/13 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
继电保护工岗位职责
2014/01/05 职场文书
护理专业优质毕业生自荐书
2014/01/31 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
《散步》教学反思
2014/03/02 职场文书
太太口服液广告词
2014/03/20 职场文书
名人传读书笔记
2015/06/26 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python
Fluentd搭建日志收集服务
2022/09/23 Servers