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中AND、OR的一个使用小技巧
Feb 18 Python
Python简单进程锁代码实例
Apr 27 Python
python从sqlite读取并显示数据的方法
May 08 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python设置环境变量的原因和方法
Jun 24 Python
python多线程http压力测试脚本
Jun 25 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
Python如何实现感知器的逻辑电路
Dec 25 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 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中文字母数字验证码实现代码
2008/04/25 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
javascript 常用方法总结
2009/06/03 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
js读取cookie方法总结
2014/10/31 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
[31:29]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第一场 12.20
2020/12/23 DOTA
python制作企业邮箱的爆破脚本
2016/10/05 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
土建专业大学生自荐信范文
2014/04/09 职场文书
药品业务员岗位职责
2014/04/17 职场文书
土木工程求职信
2014/05/29 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
maven依赖的version声明控制方式
2022/01/18 Java/Android
python解析照片拍摄时间进行图片整理
2022/07/23 Python