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使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Python科学计算之Pandas详解
Jan 15 Python
python模块之paramiko实例代码
Jan 31 Python
浅析python的Lambda表达式
Feb 27 Python
Python实战之制作天气查询软件
May 14 Python
python面试题之列表声明实例分析
Jul 08 Python
Python列表的切片实例讲解
Aug 20 Python
python解释器安装教程的方法步骤
Jul 02 Python
Java byte数组操纵方式代码实例解析
Jul 22 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
python3.5的包存放的具体路径
Aug 16 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基础知识:类与对象(1)
2006/12/13 PHP
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
php页面缓存方法小结
2015/01/10 PHP
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
深入浅析Python字符编码
2015/11/12 Python
遗传算法之Python实现代码
2017/10/10 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
酒店应聘自荐信
2013/11/09 职场文书
活动志愿者自荐信
2014/01/27 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
学生检讨书
2015/01/27 职场文书
六一活动主持词
2015/06/30 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书