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 jupyter notebook 服务器搭建过程
Nov 30 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
Python同步遍历多个列表的示例
Feb 19 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
python 模拟银行转账功能过程详解
Aug 06 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 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重定向的三种方法分享
2012/02/22 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
用python实现对比两张图片的不同
2018/02/05 Python
python解析xml简单示例
2019/06/21 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
员工自我鉴定范文
2013/10/06 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
节约电力资源的建议书
2014/03/12 职场文书
青蓝工程实施方案
2014/03/27 职场文书
心理健康活动总结
2014/04/30 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书