热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例

本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息。分享给大家供大家参考,具体如下:importtimefrommultiprocessingimportPoolfromseleniumimportwebdr

本文实例讲述了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程序设计有所帮助。


推荐阅读
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
  • 在 Golang 应用中,频繁出现的 TIME_WAIT 和 ESTABLISHED 状态可能会导致性能瓶颈。本文探讨了这些状态产生的原因,并提出了优化与解决策略。通过调整内核参数、优化连接管理和使用连接池技术,可以有效减少 TIME_WAIT 的数量,提高应用的并发处理能力。同时,对于 ESTABLISHED 状态,可以通过合理的超时设置和错误处理机制,确保连接的高效利用和快速释放。 ... [详细]
  • 背景最近项目中用到了mongodb,并且用python的pymongo包操作。本文就把目前遇到的问题和学习经历做个小结,方便日后查询。Mongodb启动安装mongodbhttp ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 本文深入探讨了 Spring Cloud 微服务架构中 Gateway 组件的应用,详细介绍了其在实现高效请求路由与过滤方面的关键作用。文章首先从基本配置入手,逐步讲解了如何通过静态路由和动态路由实现灵活的服务访问控制。此外,还特别介绍了如何配置 Gateway 以自动从 Nacos 服务注册中心拉取服务列表,进一步提升系统的可维护性和扩展性。 ... [详细]
  • 爬虫实践-爬取简书网用户动态信息
    jianshuwanguser.py:importrequestsfromlxmlimportetreeimportpymongoclientpymongo.MongoClie ... [详细]
  • Python爬虫使用MongoDB 提示No connection adapters were found for如何解决? ... [详细]
  • 本文深入探讨了Spring Cloud Eureka在企业级应用中的高级使用场景及优化策略。首先,介绍了Eureka的安全配置,确保服务注册与发现过程的安全性。接着,分析了Eureka的健康检查机制,提高系统的稳定性和可靠性。随后,详细讨论了Eureka的各项参数调优技巧,以提升性能和响应速度。最后,阐述了如何实现Eureka的高可用性部署,保障服务的连续性和可用性。通过这些内容,开发者可以更好地理解和运用Eureka,提升微服务架构的整体效能。 ... [详细]
  • 本文介绍了一种专为清洁工人设计的自定义文本烟花效果。通过该功能,用户可以输入特定的感谢或祝福语句,系统将生成绚丽的烟花动画,以表达对清洁工人的敬意和感激之情。该特效不仅美观,还能增强用户的互动体验,提升公共场合的氛围。 ... [详细]
  • 利用Jenkins与SonarQube集成实现高效代码质量检测与优化
    本文探讨了通过在 Jenkins 多分支流水线中集成 SonarQube,实现高效且自动化的代码质量检测与优化方法。该方案不仅提高了开发团队的代码审查效率,还确保了软件项目的持续高质量交付。 ... [详细]
  • 利用命令行配置 ASP.NET Core 发布后的监听地址与环境变量设置
    通过命令行配置 ASP.NET Core 应用程序的发布设置,可以灵活地调整监听地址和环境变量。本文介绍如何在新建的 ASP.NET Core 项目中,通过修改 `Program.cs` 文件中的代码来实现这一功能。具体步骤包括在 `Program` 类的 `Main` 方法中添加相应的配置代码,以确保应用程序在不同环境中能够正确运行。此外,还将详细介绍如何使用命令行工具来设置和验证这些配置项,从而提高开发和部署的效率。 ... [详细]
  • 谢邀。---2016.09.20补充---GitHub-gregmalcolmpython_koans:PythonKoans是个不错的练手项目,我还曾经给它贡献过代 ... [详细]
author-avatar
mobiledu2502873157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有