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正则表达式教程之一:基础篇
Mar 02 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
Python 将pdf转成图片的方法
Apr 23 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
python opencv摄像头的简单应用
Jun 06 Python
python 执行终端/控制台命令的例子
Jul 12 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
python实现字符串和数字拼接
Mar 02 Python
Python打印不合法的文件名
Jul 31 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 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网上调查系统
2006/10/09 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
js中less常用的方法小结
2017/08/09 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
vue实现拖拽效果
2019/12/23 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
python+pyqt5编写md5生成器
2019/03/18 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
商务英语专业应届毕业生求职信
2013/10/28 职场文书
车工岗位职责
2013/11/26 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书