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 相关文章推荐
python使用nntp读取新闻组内容的方法
May 08 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
python连接数据库的方法
Oct 19 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
python 三元运算符使用解析
Sep 16 Python
python 创建一维的0向量实例
Dec 02 Python
Python文件操作函数用法实例详解
Dec 24 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
python如何实现单链表的反转
Feb 10 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
通过实例了解python__slots__使用方法
Sep 14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 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源代码
2006/10/09 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
python自定义解析简单xml格式文件的方法
2015/05/11 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python获取url的返回信息方法
2018/12/17 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
入团者的自我评价分享
2013/12/02 职场文书
青蓝工程实施方案
2014/03/27 职场文书
保护动物的标语
2014/06/11 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
员工年度工作总结2015
2015/05/18 职场文书