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函数中的函数(闭包)用法实例
Mar 15 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
python+pygame简单画板实现代码实例
Dec 13 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
Python 修改列表中的元素方法
Jun 26 Python
PyCharm配置mongo插件的方法
Nov 30 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
python禁用键鼠与提权代码实例
Aug 16 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
div层的移动及性能优化
2010/11/16 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
Python标准库与第三方库详解
2014/07/22 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
Python实现感知机(PLA)算法
2017/12/20 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
浅析python中while循环和for循环
2019/11/19 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
怎样写好自我评价呢?
2014/02/16 职场文书
代理协议书范本
2014/04/22 职场文书
总账会计岗位职责
2015/04/02 职场文书
学生会自荐信
2019/05/16 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
js中Object.create实例用法详解
2021/10/05 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android