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://www.hqwc.cn/news/576297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战 | 微调训练TrOCR识别弯曲文本

导 读 本文主要介绍如何通过微调训练TrOCR实现弯曲文本识别。 背景介绍 TrOCR(基于 Transformer 的光学字符识别)模型是性能最佳的 OCR 模型之一。在我们之前的文章中,我们分析了它们在单行打印和手写文本上的表现。 TrOCR—基于Transforme…

HarmonyOS 应用开发之Want的定义与用途

Want 是一种对象,用于在应用组件之间传递信息。 其中,一种常见的使用场景是作为 startAbility() 方法的参数。例如,当UIAbilityA需要启动UIAbilityB并向UIAbilityB传递一些数据时,可以使用Want作为一个载体,将数据传递…

C#实现身份证格式验证(自建异常实现提醒)

基本信息 中国居民身份证的格式包括18位数字,这些数字分别代表不同的信息: 第1、2位数字表示省份代码。 第3、4位数字表示城市代码。 第5、6位数字表示区县代码。 第7至14位数字表示出生年、月、日(其中7、8、9、10位是年,11、12…

ZK友好代数哈希函数安全倡议

1. 引言 前序博客: ZKP中的哈希函数如何选择ZK-friendly 哈希函数?snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式:高效的ZK友好的哈希函数Tip5:针对Recursive STARK的哈希函数 随着Incrementally Ve…

Uibot6.0 (RPA财务机器人师资培训第5天 ) 报销汇总机器人案例实战

训练网站:泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https…

独立游戏《星尘异变》UE5 C++程序开发日志3——UEC++特供的数据类型

本篇日志将介绍FString,FText、FName的用法和相互转换,以及容器TMap,TArray的增删查改 一、字符串相关数据类型:FString、FText、FName FString是最接近std::string的类型,字符串本身可以看做一个存储char型的动态数…

「15」操作非常简单,小白也能在直播间一键添加色源

「15」色源添加指定色彩的纯色画面素材 在OBS软件里,在来源里可以增加色源,添加一个色块到您的场景中,作为一个背景色或辅助色。 图中的显示器就是加了色源的 实操步骤 第1步 添加色源 在「来源」的左下角,点「」选择「色源」&a…

快速上手Pytrch爬虫之爬取某应图片壁纸

一、前置知识 1 爬虫简介 网络爬虫(又被称作网络蜘蛛、网络机器人,在某些社区中也经常被称为网页追逐者)可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息。 1.1 Web网页存在方式 表层网页指的是不需要提交表单&…

【Leetcode每日一题】模拟 - 提莫攻击(难度⭐)(42)

1. 题目解析 题目链接:495. 提莫攻击 2.算法原理 一、分情况讨论 要计算中毒的总时长,我们需要考虑时间点之间的差值,并根据这些差值来确定中毒的实际持续时间。 情况一:差值大于等于中毒时间 假设你的角色在时间点A中毒&#…

【Python】python+requests+excel+unittest+ddt实现接口自动化实例

目录 测试需求实现思路框架代码实例1. 环境准备和配置文件2. Excel接口数据及测试结果3. API封装4. 读取Excel数据5. 测试用例6. 日志和配置文件处理7. HTMLTestRunner生成可视化的html报告8. 报告通过飞书/邮件发送报告通过飞书发送报告通过邮件发送9. 入口函数10. 飞书Webhoo…

idea开发工具DEBUG调试java8stream流

1.在使用到stream()的行打断点 2.执行请求拦截到断点,依次按图点击 3.进入stream断点分析 4.如上图点击flat mode进入完整的每一步处理过程 5.Ok,完结

c++ 有关类的静态成员详细笔记

什么是静态成员? 别名也可以叫做静态数据成员,如果一个类建立了多个对象,那么每一个对象都会有自己的数据成员。这些值呢?互不相干,很好地实现了每一个对象之间的区别也就是所谓的封装和隐藏。但在有的时候&#xff0…