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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
python之PyMongo使用总结
May 26 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
python实现彩色图转换成灰度图
Jan 15 Python
Python常用特殊方法实例总结
Mar 22 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python读取ini配置的类封装代码实例
Jan 08 Python
Pycharm小白级简单使用教程
Jan 08 Python
python时间日期操作方法实例小结
Feb 06 Python
python中sympy库求常微分方程的用法
Apr 28 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
python字典与json转换的方法总结
Dec 28 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
python实现浪漫的烟花秀
2019/01/30 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
旅游管理毕业生自荐信范文
2014/03/19 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
领导干部对照检查材料
2014/08/24 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
投诉信范文
2015/07/02 职场文书
银行服务理念口号
2015/12/25 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL