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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Python中使用PDB库调试程序
Apr 05 Python
Python制作数据导入导出工具
Jul 31 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
flask中的wtforms使用方法
Jul 21 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
python本地文件服务器实例教程
May 02 Python
python爬虫之selenium库的安装及使用教程
May 23 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 str_replace的替换漏洞
2008/03/15 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
JavaScript URL参数读取改进版
2009/01/16 Javascript
关于this和self的使用说明
2010/08/01 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
Pyqt5实现英文学习词典
2019/06/24 Python
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
大学生找工作推荐信范文
2013/11/28 职场文书
海南地接欢迎词
2014/01/14 职场文书
元旦晚会感言
2014/03/12 职场文书
如何写早恋检讨书
2014/09/10 职场文书
2014年药店工作总结
2014/11/20 职场文书
物流业务员岗位职责
2015/04/03 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
小学运动会报道稿
2015/07/22 职场文书
七年级话题作文之执着
2019/11/19 职场文书