网络编程
位置:首页>> 网络编程>> Python编程>> Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例

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

作者:wanlifeipeng  发布时间:2023-06-13 09:23:30 

标签:Python,Selenium,抓取

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

来源:http://www.cnblogs.com/hupeng1234/p/7138551.html

0
投稿

猜你喜欢

  • 我在网站上设置了邮件列表功能,实现用户自动订阅和发送,但很多用户输入和提交的邮件地址格式都是无效的,无法处理。请问如何解决这一问题?&nbs
  • 这样的问题是因为 数据库字符集,表字符集,字段字符集都设为:gbk_chinese_ci 注意数据库连接串里面的 Stmt=Set Name
  • 代码如下: var lishustr = "qwertyuiopasdfghjklmnbvcxz"; var s = l
  • [本站原创]在我们浏览了一些网页时,经常会弹出一些信息窗口或浏览器窗口以显示一些公告内容,想知道这些窗口是怎么制作出来的吗?如果你还不曾知道
  • 由于数据文件平时在数据库运行的时候处于使用状态,故当数据库处于打开状态时,管理员是无法重命名数据文件名字的。那么一定要更改这个数据文件的名字
  • 1.彻底弄懂CSS盒子模式一(DIV布局快速入门)3.彻底弄懂CSS盒子模式三(浮动的表演和清除的自述) 4.彻底弄懂CSS盒子模式四(绝对
  • 是否看见大站的广告都是放在内容中间实现文字环绕的呢,一般普通小站广告只能放在内容开头或者结尾,也许大站的cms系统带这个功能吧,我们小站常用
  • 交互设计师的一项重要工作就是进行产品原型设计(Prototype Design)。而产品原型设计最基础的工作,就是画出站点的大体wirefr
  • ASCII(str) 返回字符串str的第一个字符的ASCII值(str是空串时返回0)mysql> select ASCII(
  • IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内
  • jQuery居然都没有JSON的decode和encode,精确类型判断也没有,囧……自己动手写吧!不过这些东西在网上都已经有很好的版本了,
  • XMLHttpRequest的兼容代码功能结构上大体没有什么变动主要处理了这么几条:1.不同浏览器的创建方式2.事件大小写问题(ie7的XM
  • 就javascript来说,iframe创建的框架和frameset创建的框架一样。这里有个关系图,做个笔记。图片源自《javascript
  • 在实际工作中,无论是对数据库系统(DBMS),还是对数据库应用系统(DBAS),查询优化一直是一个热门话题。一个成功的数据库应用系统的开发,
  • Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命
  • 这些CSS Selector在平时写页面的时候用地不多,只在JavaScript库、Firefox插件、iPhone页面里有过接触。推荐大家
  • 你和用户之间的网站堆栈(简化版)在TXJS大会的最后一天,一个开发者问我:面向对象的CSS没有给你留下一大堆基于表现的class名?网络堆栈
  • 最近我因为要安装 Firebug 1.4 导致我不得不安装了 Firefox 3.5 ,所以很不小心地接触到了Wordpress后台那漂亮的
  • 良好的编程习惯是每个程序员都应该具备的工作素质,在我的软件生涯中屡屡发现一些程序员的身上总有这样或者那样的坏毛病。这些毛病在一些从业时间不是
  • 照片尺寸  单位:cm1X1.5 (1寸) 2.6*3.9 一寸2.5*3.5 1.5X2 (2寸) 3.8*
手机版 网络编程 asp之家 www.aspxhome.com