【自动化实战】(三)筛选活动中点赞数量 TOP5 的作品

举报
sidiot 发表于 2023/10/20 22:43:29 2023/10/20
【摘要】 本篇博文是 《Selenium IDE 自动化实战案例》 系列的第三篇博文,主要内容是通过 selenium 来获取活动中作品的点赞数量,并筛选出 TOP5;

前言

本篇博文是 《Selenium IDE 自动化实战案例》 系列的第篇博文,主要内容是通过 selenium 来获取活动中作品的点赞数量,并筛选出 TOP5,博文中的所有代码全部收集在博主的 GitHub 仓库 中;

严正声明:本博文所讨论的技术仅用于研究学习,任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

背景

在参加社区的技术创作特训营活动,其中有个 “最受欢迎创作者” 奖项,需要单篇作品点赞量 TOP3 的作者才能获奖,本来是无意参与其中,后来发现自己有机会,就努力了一下,没想到自此一发不可收拾,对手们都太猛了。

因此,为了能够实时观测到点赞量 TOP5 的情况,写了自动化脚本来获取数据。

实现

1、获取标题、作者和点赞数量的页面元素:

复制他们的 XPATH 路径,如下所示:

# 标题
/html/body/div[1]/div[1]/div[3]/div[3]/div[1]/div/div[2]/com/div/section[21]/div[1]/h3

# 作者
/html/body/div[1]/div[1]/div[3]/div[3]/div[1]/div/div[2]/com/div/section[21]/div[2]/div[2]/div[1]/div/div/a

# 点赞数量
/html/body/div[1]/div[1]/div[3]/div[3]/div[1]/div/div[2]/com/div/section[21]/div[2]/div[2]/div[2]/span[2]

2、因为每一个作品都是一个 section 块,因此需要获取当前页面的 section 元素,

复制 XPATH 路径,如下所示:

/html/body/div[1]/div[1]/div[3]/div[3]/div[1]/div/div[2]/com/div[1]/section

3、接下来,我们就可以使用循环获取每个作品的标题、作者和点赞数量了,代码如下所示:

self.vars["array"] = []
self.vars["sections"] = self.driver.find_elements(
    By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div[1]/div/div[2]/com/div[1]/section")

try:
    for section in self.vars["sections"]:
        # 作者
        author = section.find_element(
            By.XPATH, "./div[2]/div/div[1]/div/div/a").text
        # 题目
        title = section.find_element(By.XPATH, "./div[1]/h3").text
        # 点赞数量
        nums = section.find_element(
            By.XPATH, "./div[2]/div/div[2]/span[2]").text
        self.vars["array"].append((author, title, nums))
except:
    pass

运行结果:

4、排序选出 TOP5,这里的话使用 sorted 方法,通过 Lambda 表达式选择元组中的最后一个元素 nums 作为排序的依据:

sorted(self.vars["array"], key=lambda x: int(x[-1]), reverse=True)[:5]

运行结果:

优化

由于页面使用 JS 进行动态渲染,也就是所谓的懒加载,我们只能获取到部分数据,因此需要设计滚动,模拟鼠标滚轮一直往下翻,直到到底部为止。

在 JS 中有个方法能够滑动页面 window.scrollBy(0, 4000),同时还有一个方法能够获取当前滚动条距离顶部的距离 document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;,于是将这两个方法组合在一起,我们就可以控制滚动条一直滑动到最底部了,代码如下所示:

def roll(self):
    # 模拟滚动置底
    temp_height = 0
    while True:
        # 循环将滚动条下拉
        self.driver.execute_script("window.scrollBy(0, 4000)")
        # sleep一下让滚动条反应一下
        time.sleep(1)
        # 获取当前滚动条距离顶部的距离
        check_height = self.driver.execute_script(
            "return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;")
        # 如果两者相等说明到底了
        if check_height == temp_height:
            break
        temp_height = check_height

后记

通过使用 Selenium 编写的自动化取关脚本,我们成功地获取了活动中作品的点赞数量,并使用 sorted 函数筛选出了 TOP5 的作品;

以上就是 筛选活动中点赞数量 TOP5 的作品 的所有内容了,希望本篇博文对大家有所帮助!

严正声明:本博文所讨论的技术仅用于研究学习,任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持;

👍 公众号:sidiot的技术驿站

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。