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模拟登陆Tom邮箱示例分享
Jan 13 Python
Python中多线程及程序锁浅析
Jan 21 Python
简单介绍Python中利用生成器实现的并发编程
May 04 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
Python基于dom操作xml数据的方法示例
May 12 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
利用anaconda作为python的依赖库管理方法
Aug 13 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
python中K-means算法基础知识点
Jan 25 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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
类似框架的js代码
2006/11/09 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
python字典操作实例详解
2017/11/16 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
python openpyxl使用方法详解
2019/07/18 Python
详解python中__name__的意义以及作用
2019/08/07 Python
wxPython实现带颜色的进度条
2019/11/19 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
python如何进行矩阵运算
2020/06/05 Python
美国糖果店:Sugarfina
2019/02/21 全球购物
店铺转让协议书
2015/01/29 职场文书
小学运动会宣传稿
2015/07/23 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python