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的几条建议分享
Feb 10 Python
python实现中文转换url编码的方法
Jun 14 Python
python常见排序算法基础教程
Apr 13 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
Dec 21 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
Python中print函数简单使用总结
Aug 05 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
python基于property()函数定义属性
Jan 22 Python
浅谈Python3中print函数的换行
Aug 05 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 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/07/12 PHP
由php if 想到的些问题
2008/03/22 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
php短址转换实现方法
2015/02/25 PHP
php中return的用法实例分析
2015/02/28 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
python encode和decode的妙用
2009/09/02 Python
详解python中的json的基本使用方法
2016/12/21 Python
python正则分析nginx的访问日志
2017/01/17 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
Python版名片管理系统
2018/11/30 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
Python常用类型转换实现代码实例
2020/07/28 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
Jar包的作用是什么
2014/03/30 面试题
遗体告别仪式答谢词
2014/01/23 职场文书
优秀干部获奖感言
2014/01/31 职场文书
三八妇女节活动总结
2014/05/04 职场文书
PHP中->和=>的意思
2021/03/31 PHP
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS