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

所属分类: 脚本专栏 / python 阅读数: 959
收藏 0 赞 0 分享

动态页面的模拟点击:

以斗鱼直播为例: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写了一个股票提醒系统,迷你版量化系统,完美的实现了实时提醒功能,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Python绘制的二项分布概率图示例

这篇文章主要介绍了Python绘制的二项分布概率图,涉及Python基于numpy、math的数值运算及matplotlib图形绘制相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Python Learning 列表的更多操作及示例代码

这篇文章主要介绍了Python Learning-列表的更多操作,需要的朋友可以参考下
收藏 0 赞 0 分享

关于python列表增加元素的三种操作方法

这篇文章主要介绍了关于python列表增加元素的几种操作方法,主要有insert方法,extend方法和append方法,每种方法给大家介绍的非常详细,需要的朋友可以参考下
收藏 0 赞 0 分享

如何在python字符串中输入纯粹的{}

这篇文章主要介绍了如何在python字符串中输入纯粹的{}以及python字符串连接的三种方法,需要的朋友可以参考下
收藏 0 赞 0 分享

浅谈Django的缓存机制

这篇文章主要介绍了浅谈Django的缓存机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Django 限制用户访问频率的中间件的实现

这篇文章主要介绍了Django 限制用户访问频率的中间件的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

示例详解Python3 or Python2 两者之间的差异

这篇文章主要介绍了Python3 or Python2?示例详解两者之间的差异,在本文中给大家介绍的非常详细,需要的朋友可以参考下
收藏 0 赞 0 分享

Python wxpython模块响应鼠标拖动事件操作示例

这篇文章主要介绍了Python wxpython模块响应鼠标拖动事件操作,结合实例形式分析了Python使用wxpython模块创建窗口、绑定事件及相应鼠标事件相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

使用Python实现一个栈判断括号是否平衡

栈(Stack)在计算机领域是一个被广泛应用的集合,栈是线性集合,访问都严格地限制在一段,叫做顶(top)。这篇文章主要介绍了使用Python实现一个栈判断括号是否平衡,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多