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标准库os.path包、glob包使用实例
Nov 25 Python
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
详解Python中find()方法的使用
May 18 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
python numpy矩阵信息说明,shape,size,dtype
May 22 Python
python如何进行矩阵运算
Jun 05 Python
为什么python比较流行
Jun 19 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自动给网址加上链接的方法
2015/06/02 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
python简单程序读取串口信息的方法
2015/03/13 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
Python合并多个Excel数据的方法
2018/07/16 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
装修设计师求职信
2014/02/26 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
毕业证明书
2015/06/19 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL