Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例


Posted in Python onJuly 18, 2018

本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息。分享给大家供大家参考,具体如下:

import time
from multiprocessing import Pool
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from bs4 import BeautifulSoup
from pymongo import MongoClient
from pymongo.errors import PyMongoError
# monogdb配置信息
MONGO_HOST = "localhost"
MONGO_DATABASE = "douyu"
MONGO_TABLE = "zhibo"
client = MongoClient(host=MONGO_HOST)
db = client[MONGO_DATABASE]
# PhantomJS 命令行相关配置
# 参见 http://phantomjs.org/api/command-line.html
SERVICE_ARGS = ['--disk-cache=true', '--load-images=false']
# driver = webdriver.Chrome() # 有界面
driver = webdriver.PhantomJS(service_args=SERVICE_ARGS) # 无界面
delay = 10
wait = WebDriverWait(driver, delay)
driver.maximize_window()
def get_total_pages():
  url = 'https://www.douyu.com/directory/all'
  driver.get(url)
  pages = int(driver.find_element_by_css_selector(
    '.shark-pager-dot + .shark-pager-item').text)
  print("正在获取第1页数据")
  room_list = get_rooms_by_beautifulsoup()
  save_to_monogodb(room_list)
  return pages
# 根据页码获取指定页数据,并将其保存到数据库中
def parse_page(page_num):
  print("正在获取第%d页数据" % page_num)
  try:
    page_num_box = wait.until(
      EC.presence_of_element_located(
        (By.CSS_SELECTOR, "input.jumptxt")))
    go_btn = wait.until(EC.element_to_be_clickable(
      (By.CSS_SELECTOR, 'a.shark-pager-submit')))
    page_num_box.clear()
    page_num_box.send_keys(page_num)
    go_btn.click()
    # driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # time.sleep(0.1)
    wait.until(
      EC.text_to_be_present_in_element(
        (By.CSS_SELECTOR,
         '.shark-pager-item.current'),
        str(page_num)))
    # 对于By.CLASS_NAME invalid selector: Compound class names not permitted
    room_list = get_rooms_by_beautifulsoup()
    save_to_monogodb(room_list)
  except TimeoutException:
    print("请求第%d页失败" % page_num)
    print("尝试重新获取第%d页" % page_num)
    return parse_page(page_num)
# 通过bs4解析数据
def get_rooms_by_beautifulsoup():
  '''
  通过bs4库解析数据
  获取直播间的名称,观看人数,标签,主播名
  '''
  wait.until(EC.presence_of_element_located(
    (By.CSS_SELECTOR, "ul#live-list-contentbox > li")))
  html = driver.page_source
  soup = BeautifulSoup(html, 'lxml')
  rooms = soup.select('ul#live-list-contentbox > li')
  for room in rooms:
    room_name = room.find(
      'h3', attrs={
        'class': 'ellipsis'}).get_text(
      strip=True)
    view_count = room.find('span', class_='dy-num fr').text
    tag = room.find('span', class_='tag ellipsis').text
    hostname = room.find('span', class_='dy-name ellipsis fl').text
    #print("房间名: " + room_name + "\t观看人数: " + view_count + "\t标签: " + tag + "\t主播名: " + hostname)
    yield {
      'room_name': room_name,
      'view_count': view_count,
      'tag': tag,
      'hostname': hostname,
    }
def save_to_monogodb(room_list):
  for room in room_list:
    try:
      db[MONGO_TABLE].insert(room)  # insert支持插入多条数据
      print("mongodb插入数据成功:", room)
    except PyMongoError as e:
      print("mongodb插入数据失败:", room, e)
if __name__ == '__main__':
  try:
    total_pages = get_total_pages()
    for page_num in range(2, total_pages + 1):
      parse_page(page_num)
  except Exception as e:
    print("出错了", e)
  finally: # 确保 浏览器能正常关闭
    print("共有%d页" % total_pages)
    driver.close()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
python筛选出两个文件中重复行的方法
May 31 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
windows上安装python3教程以及环境变量配置详解
Jul 18 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
用基于python的appium爬取b站直播消费记录
Apr 17 Python
解决Python3中的中文字符编码的问题
Jul 18 #Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 #Python
python 将print输出的内容保存到txt文件中
Jul 17 #Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 #Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 #Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 #Python
python3.x 将byte转成字符串的方法
Jul 17 #Python
You might like
php定界符
2014/06/19 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
js Date概念详细介绍
2013/11/22 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
Python全局变量操作详解
2015/04/14 Python
Python表示矩阵的方法分析
2017/05/26 Python
简单实现python聊天程序
2018/04/01 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
高中自我鉴定
2013/12/20 职场文书
小小的船教学反思
2014/02/21 职场文书
给朋友的赠语
2015/06/23 职场文书
运动会宣传稿50字
2015/07/23 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python