selenium实战之爬取虎牙直播列表页

文章目录

    • 声明
    • 实现流程给你
    • 主播列表页面分析
      • 登录遮罩层处理
      • 解析直播列表的数据
      • 分页处理
    • 完整的代码

声明

前面有了 selenium的基础,这里就拿虎牙直播页面来做一个实战测试,这是作为学习,测试使用,并不用作为商业用途,不刻意损害他人利益

实现流程给你

在这里插入图片描述

主播列表页面分析

我们需要把中间部分的列表页面内容给爬取下来,包括直播间封面,名称,主播昵称,头像,热度,游戏类别等。
从他的页面结构可以看出,其 xpath就是:

//div[@class="box-bd"]//ul[@id="js-live-list"]/li

在这里插入图片描述
在这里插入图片描述

登录遮罩层处理

从页面结构来看,登录弹窗是在一个 id="UDBSdkLgn_iframe"的iframe中,所以我们在这里在进来时候,需要先切换到 iframe中,然后将窗口关闭

在这里插入图片描述

  • 代码实现:
  1. 开启隐式等待,等待元素加载完成
  2. 将句柄切换到 iframe中,关闭登录弹窗
  3. 从 iframe中切除,回到主页面
...# 隐式等待 最大10秒self.driver.implicitly_wait(10)# 关闭登录弹窗,需要切换到弹窗的iframe中self.driver.switch_to.frame('UDBSdkLgn_iframe')self.driver.find_element(by=By.ID, value="close-udbLogin").click()# 从弹窗的iframe中切换回主页面self.driver.switch_to.default_content()
...

解析直播列表的数据

根据 xpath 分析出各个元素的内容,在这里封装了一个函数,在每一页去拉取时调用它,代码如下:

def parse(self):"""解析虎牙直播的数据@param data_list:属于引用数据@return:"""list_data = []room_list = self.driver.find_elements(by=By.XPATH, value='//div[@class="box-bd"]//ul[@id="js-live-list"]/li')for elem in room_list:# 获取每个直播间的 链接,封面,直播间名字,主播名称,热度,游戏类名组成字典tmp_dic = {}# 直播间链接tmp_dic['link'] = elem.find_element(by=By.XPATH, value='./a[1]').get_attribute('href')# 直播间封面tmp_dic['cover'] = elem.find_element(by=By.XPATH, value='./a[1]/img').get_attribute('src')# 直播间名字tmp_dic['name'] = elem.find_element(by=By.XPATH, value='./a[2]').text# 主播头像tmp_dic['user-cover'] = elem.find_element(by=By.XPATH,value='./span[@class="txt"]/span[1]/img').get_attribute('src')# 主播昵称tmp_dic['user-name'] = elem.find_element(by=By.XPATH, value='./span[@class="txt"]/span[1]/i').text# 游戏名称tmp_dic['game-name'] = elem.find_element(by=By.XPATH, value='./span[@class="txt"]/span[2]/a').texttmp_dic['hot'] = elem.find_element(by=By.XPATH, value='./span[@class="txt"]/span[3]/i[2]').textlist_data.append(tmp_dic)passreturn list_data

分页处理

因为分页结构在最下面,所以需要来用 js做一个页面滚动,滚动时,水平方向不用变,垂直放下往下滚动到最下面就行
在这里插入图片描述

  • 代码片段:
# 滚动到底部
self.driver.execute_script("window.scrollTo(0, 10000);")
self.driver.find_element(by=By.XPATH,value='//div[@id="js-list-page"]//a[@class="laypage_next"]').click()

完整的代码

我在这里是爬取前10页,所以在在解析和分页的外面套了一层循环,再每一页分析完成,入库到 mongodb中,具体看如下完整代码:

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromService
from selenium.webdriver.common.by import Byfrom db.mongo_pool import MongoPoolclass GetHuyaDatas(object):def __init__(self):self.url = 'https://www.huya.com/l'# 显示设置驱动的路径,这是 selenium4之后的新写法,主要是为了解决 selenium打开浏览器慢的问题service = ChromService(executable_path="/usr/local/bin/chromedriver")self.driver = webdriver.Chrome(service=service)passdef run(self):self.driver.get(self.url)# 关闭登录弹窗try:# 隐式等待 最大10秒self.driver.implicitly_wait(10)# 关闭登录弹窗,需要切换到弹窗的iframe中self.driver.switch_to.frame('UDBSdkLgn_iframe')self.driver.find_element(by=By.ID, value="close-udbLogin").click()# 从弹窗的iframe中切换回主页面self.driver.switch_to.default_content()except Exception as e:print(e)pass# 隐式等待 最大10秒,等待ajax请求完成self.driver.implicitly_wait(10)# 遍历10页for i in range(0, 10):# 解析data_list = self.parse()self.save_data(data_list)# 点击下一页,获取新的页面内容try:# 滚动到底部self.driver.execute_script("window.scrollTo(0, 10000);")self.driver.find_element(by=By.XPATH,value='//div[@id="js-list-page"]//a[@class="laypage_next"]').click()except:print('已经到最后一页了')passtime.sleep(10)self.driver.quit()passdef save_data(self, data_list):"""保存数据到mongodb@param data_list:@return:"""res = MongoPool().test.huya.insert_many(data_list)print(res.inserted_ids)def parse(self):"""解析虎牙直播的数据@param data_list:属于引用数据@return:"""list_data = []room_list = self.driver.find_elements(by=By.XPATH, value='//div[@class="box-bd"]//ul[@id="js-live-list"]/li')for elem in room_list:# 获取每个直播间的 链接,封面,直播间名字,主播名称,热度,游戏类名组成字典tmp_dic = {}# 直播间链接tmp_dic['link'] = elem.find_element(by=By.XPATH, value='./a[1]').get_attribute('href')# 直播间封面tmp_dic['cover'] = elem.find_element(by=By.XPATH, value='./a[1]/img').get_attribute('src')# 直播间名字tmp_dic['name'] = elem.find_element(by=By.XPATH, value='./a[2]').text# 主播头像tmp_dic['user-cover'] = elem.find_element(by=By.XPATH,value='./span[@class="txt"]/span[1]/img').get_attribute('src')# 主播昵称tmp_dic['user-name'] = elem.find_element(by=By.XPATH, value='./span[@class="txt"]/span[1]/i').text# 游戏名称tmp_dic['game-name'] = elem.find_element(by=By.XPATH, value='./span[@class="txt"]/span[2]/a').texttmp_dic['hot'] = elem.find_element(by=By.XPATH, value='./span[@class="txt"]/span[3]/i[2]').textlist_data.append(tmp_dic)passreturn list_datapass
  • 调用:
if __name__ == '__main__':huya = GetHuyaDatas()huya.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2905655.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【话题】AI大模型学习:理论、技术与应用探索

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景1. AI大模型学习的基础理论1.1 机器学习1.2 深度学习 2. AI大模型学习的技术要点2.1 模型结构设计2.2 算法优化2.3 大规模数据处理 3. AI大模型学习的应用场景3.1 自…

为啥学霸反而很少被霸凌?

编辑搜图 请点击输入图片描述(最多18字) ​为什么学霸很少被霸凌? 在我们的学生时代,总有一些同学因为成绩优秀而被大家称为“学霸”。然而,你是否注意到,这些学霸同学往往很少成为霸凌的受害者&#xff…

广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. 系…

数据可视化-ECharts Html项目实战(7)

在之前的文章中,我们学习了如何设置漏斗图、仪表盘。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢 数据可视化-ECharts Html项目实战(6…

Ubuntu通过分用户进行多版本jdk配置

前言:本文内容为实操记录,仅供参考! linux安装jdk参考:http://t.csdnimg.cn/TeECj 出发点:最新的项目需要用jdk17来编译,就把服务器的jdk版本升级到了17,但是有一些软件例如nexus还需要jdk1.8进…

Vue挂载全局方法

简介:有时候,频繁调用的函数,我们需要把它挂载在全局的vue原型上,方便调用,具体怎么操作,这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

Rancher介绍

1.什么是Rancher Rancher是一套容器管理平台,专门用于部署和管理容器化应用。以下是关于Rancher的详细介绍: 容器编排与管理:Rancher是一个开源的企业级容器管理平台,它支持Kubernetes作为其容器编排引擎。Rancher可以帮助用户在…

【ARM】DS-5的使用单独编译器的激活方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 用于解决客户在使用DS5的license去激活单独的编译器的步骤。 2、 问题场景 客户在购买了DS-5的license之后,不采用IDE的开发方式,采用使用单独编译器的方式对于工程进行构建。激活出现问题&a…

swagger/knife4j 接口文档增加图标 springboot

1.在资源目录下增加图标文件 2.配置/favicon.ico 资源 Configuration public class WebConfig implements WebMvcConfigurer {Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/favicon.ico").addResour…

工业智能物联网关如何助力工业防震减灾

地震灾害难以预料,一旦发生往往就损失重大。对于工业领域而言,地震灾害的影响不仅仅是对人员安全的威胁,还包括对生产设施的破坏、生产进程的中断以及伴生的持续性经济损失。 随着5G、大数据、物联网技术的发展,面向工业领域构建一…

ventoy_grub2_boot_win7_win10.md

ventoy (grub2) 的 extMenu启动 win7 efi 、win10 efi ventoy界面按F6(extMenu菜单) 弹出 ventoy/ventoy_grub.cfg中的菜单内容 ventoy (grub2) 的 extMenu启动 win7 efi 1. 生成 老式 分区启动记录 EFI\Microsoft\Boot\bootmgfw.efi: 命令: bcdboot…

PowerBI加权计算权重

1.打开主页,点击快速度量值 2.计算里面 选择计算:每个类别的加权平均值 3.就是添加数据,基值(就是你要计算的值)粗细(就是你要用那个值计算权重)类别(就是你是要乘以那个类别&#x…

苹果应用商店上架利器:推荐几款常用的应用发布工具

摘要 移动应用app上架是开发者关注的重要环节,但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作,各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用,最终指出合理使用工具的重要性。 引言 移动应…

死守9.9元的库迪,反倒留不住联营商了?

作者 | 曾响铃 文 | 响铃说 作为去年的竞争关键词,“9.9元价格战”延续热度,再度成为今年咖啡行业的讨论重心。这之中,又以瑞幸和库迪这对“老冤家”掀起的舆论浪潮最甚。 早已走向常态性盈利的瑞幸依然选择9.9来扩大市场份额;…

10个替代Sketch的软件大盘点!第一款震撼来袭!

Sketch是Mac平台上专门为用户界面设计的矢量图形绘制工具。Sketch简单的界面背后有优秀的矢量绘制能力和丰富的插件库。但遗憾的是,Sketch只能在Mac平台上使用和浏览,而且是本地化的工具,云共享功能并不完善。在本文中,我们评估了…

免费翻译pdf格式论文

进入谷歌翻译网址https://translate.google.com/?slauto&tlzh-CN&opdocs 将需要全文翻译的pdf放进去 选择英文到中文,然后点击翻译 可以选择打开译文或者下载译文,下载译文会下载到电脑上,打开译文会在浏览器打开。

Linux基础篇:解析Linux命令执行的基本原理

Linux 命令是一组可在 Linux 操作系统中使用的指令,用于执行特定的任务,例如管理文件和目录、安装和配置软件、网络管理等。这些命令通常在终端或控制台中输入,并以文本形式显示输出结果。 Linux 命令通常以一个或多个单词的简短缩写或单词…

SIP-6002D对讲终端使用说明 SIP对讲求助终端

SIP对讲终端SIP-6002D双按键是一款采用了ARMDSP架构;配置了麦克风输入和扬声器输出,SIP-6002D带两路寻呼按键,可实现SIP对讲功能,作为SIP对讲的终端,主要用于银行、部门机构、调度室、化工厂、钢铁厂、矿井、风电等场所…

.NET CORE使用Redis分布式锁续命(续期)问题

结合上一期 .NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案(.NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案-CSDN博客)。有的小伙伴私信说如果锁内锁定的程序或者资源未在上锁时间内执行完,造成的使用资源冲突,需要如何解决。本…

五种免费的Python开发环境及具体下载网址

五种免费的Python开发环境及具体下载网址 目录 五种免费的Python开发环境及具体下载网址1.Anaconda2.PyCharm Community Edition3.Visual Studio Code4.Jupyter Notebook5. WinPython Python编程可选择不同的开发工具环境进行,本文介绍五种常用的,读者可…