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实现代理服务功能实例
Nov 15 Python
下载安装setuptool和pip linux安装pip    
Jan 24 Python
python操作sqlite的CRUD实例分析
May 08 Python
python实现多线程的两种方式
May 22 Python
python导入时小括号大作用
Jan 10 Python
使用python实现个性化词云的方法
Jun 16 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
定制FileField中的上传文件名称实例
Aug 23 Python
python字符串Intern机制详解
Jul 01 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
Python中的特殊方法以及应用详解
Sep 20 Python
Python Django获取URL中的数据详解
Nov 01 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
smarty实例教程
2006/11/19 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
splice slice区别
2006/10/09 Javascript
代码生成器 document.write()
2007/04/15 Javascript
Js 本页面传值实现代码
2009/05/17 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
jQuery实现可编辑的表格
2019/12/11 jQuery
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python IP地址转整数
2020/11/20 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
西部世纪面试题
2014/12/05 面试题
营销专业应届生求职信
2013/11/26 职场文书
公司离职证明标准范本
2014/10/05 职场文书
2014年教学工作总结
2014/11/13 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
监考失职检讨书
2015/01/26 职场文书
电力培训学习心得体会
2016/01/11 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书