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实现的二叉树算法和kmp算法实例
Apr 25 Python
Python Queue模块详解
Nov 30 Python
python查看zip包中文件及大小的方法
Jul 09 Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
Python time库基本使用方法分析
Dec 13 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
Python中如何引入第三方模块
May 27 Python
python中四舍五入的正确打开方式
Jan 18 Python
python中的getter与setter你了解吗
Mar 24 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
php获取url参数方法总结
2014/11/13 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
浅谈Python中的闭包
2015/07/08 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
英语教学随笔感言
2014/02/20 职场文书
5s推行计划书
2014/05/06 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
少先队中队工作总结
2015/08/14 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
pandas 操作 Excel操作总结
2021/03/31 Python
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
python数字图像处理之图像的批量处理
2022/06/28 Python