selenium自动化测试实战案例哔哩哔哩信息至Excel

2023-10-31


前言

最近在B站学习知识,于是看完了视频就想着练习一下巩固一下知识,就地取材的做了个B站selenium小项目,感觉还挺适合新手入门的,于是迫不及待想分享给大家。希望大家都能学到新知识,本章说的还是selenium自动化测试实现。
在这里插入图片描述

明确目标

首先开始工作之前知道我们需要哪些信息,这里我框起来的是我需要的信息,(标题,封面,up博主,时间,观看次数)。
在这里插入图片描述

最终效果

先看下程序实现的最终效果,需要的数据进行了保存。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
看完了接下来开始操作吧
在这里插入图片描述




开发环境

配置好selenium运行的环境,及相关库,(可在博客上查找)
工具:pycharm
版本:Python 3.8








思路分析

操作pyCharm打开浏览器对象,观察页面源码,用selenium定位元素的方法找到输入框和搜索框,
(注意要看一下页面源码这两个框的位置在子页面中还是在当前页面,如果在子页面中就要切换进子页面中才能定位到元素,在当前页面就可以直接上selenium定位元素)。找到输入框就可以操作selenium输入信息,并点击搜索,信息搜索出来后selenium定位元素找到全部的视频div,遍历每个div,用selenium定位我们需要的信息并提取出来。

在这里插入图片描述




实现步骤

导入相关库
在这里插入图片描述

操作pyCharm打开浏览器对象,设置窗口最大化,打开浏览器后等待输入框元素加载出来后输入关键字python并点击搜索,然后切换窗口句柄对搜索页面操作,selenium定位元素回到旧版页面并点击,这样哔哩页面就切换回旧版的页面,最后返回driver让其他函数进行操作。
在这里插入图片描述

搜索信息出来后,selenium定位页面底部的一个元素(这里我定位的元素是下一页)设置动作链移动到页面底部,防止有些页面需要异步加载数据出来。

def get_data(driver):
    all_data = []   # 空列表

    num = 1
    while num <= 50:
        print(f'=====================================正在保存第{num}页的数据内容=================================')
        # 动作链
        try:
            action = driver.find_element(By.XPATH, '//*[@class="page-item next"]/button')
            ActionChains(driver).move_to_element(action).perform()
        except:
            print('==============================没有下一页了========================')

selenium找到全部的li,遍历每一个li再用selenium提供的定位元素方法找我需要的信息提取即可,提取完就构建字典储存数据,并在空列表的末尾增添我们字典,再调用其他函数传参对封面进行保存。

        # 全部视频
        time.sleep(1)
        all_li = driver.find_elements(By.XPATH,'//*[@id="all-list"]/div[1]/div[2]/ul[2]/li')
        # 判断空列表
        if all_li == []:
            all_li = driver.find_elements(By.XPATH, '//*[@id="all-list"]/div[1]/ul/li')
        elif all_li != []:
            all_li = driver.find_elements(By.XPATH,'//*[@id="all-list"]/div[1]/div[2]/ul[2]/li')
        time.sleep(1)
        for i in all_li:
            ditail = i.find_element(By.XPATH,'./div/div[1]/a').get_attribute('href')
            title = i.find_element(By.XPATH,'./div/div[1]/a').get_attribute('title')
            new_time = i.find_element(By.XPATH,'./div/div[3]/span[3]').text
            user = i.find_element(By.XPATH,'./div/div[3]/span[4]').text
            images = i.find_element(By.XPATH,'./a/div/div[1]/img').get_attribute('src')
            if images == '':
                images = 'https://i0.hdslb.com/bfs/archive/9974b552950679b49c0e73d10bd55c29fcec35b9.png@400w_250h_1c.webp'
            watch = i.find_element(By.XPATH,'./div/div[3]/span[1]').text
            item = {
                '标题': title,
                '详情页': ditail,
                '发布时间': new_time,
                'up博主': user,
                '图片': images,
                '观看次数': watch
            }
            print(item)
            all_data.append(item)
            save_Images(title,images)

翻页实现,在页面底部我们观察发现所需的数据有50页,那么我们就可以定位到这个下一页的标签,让它每保存完一页就点击下一页,从而实现翻页的效果。
在这里插入图片描述
定位到下一页,如果每一页能找得到这个下一页的标签就点击,否则跳出循环。
在这里插入图片描述

下图函数是实现对封面进行储存。
在这里插入图片描述
数据保存至Exel中
在这里插入图片描述

运行效果

在这里插入图片描述

到这里程序就完成了,运行代码时注意保持网络畅通,如果网速太慢可能会失败,建议在网络好的环境下运行。
在这里插入图片描述





以下是全部代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains    # 动作链
from selenium.webdriver import ChromeOptions    # 浏览器配置
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd
import os.path
import requests


page = 1

def get_serch(url):
    # 创建浏览器对象
    driver = webdriver.Chrome()
    # 时间等待
    wait = WebDriverWait(driver,10)
    # 发送请求
    driver.get(url=url)
    # 窗口最大化
    driver.maximize_window()
    time.sleep(1)
    # 直到出现这个元素
    wait.until(EC.presence_of_element_located((By.TAG_NAME,'input')))
    # input输入
    entry = driver.find_element(By.TAG_NAME,'input')
    entry.send_keys('python')
    time.sleep(1)
    # click
    button = driver.find_element(By.XPATH,'//div[@class="nav-search-btn"]')
    button.click()
    # 切换窗口视角
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(2)
    # 回到旧版
    dic = driver.find_element(By.XPATH,'//*[@id="i_cecream"]/div[1]/div[2]/div/div/div/div/button[1]')
    dic.click()
    time.sleep(1)
    return driver




def get_data(driver):
    all_data = []   # 空列表

    num = 1
    while num <= 50:
        print(f'=====================================正在保存第{num}页的数据内容=================================')
        # 动作链
        try:
            action = driver.find_element(By.XPATH, '//*[@class="page-item next"]/button')
            ActionChains(driver).move_to_element(action).perform()
        except:
            print('==============================没有下一页了========================')

        # 全部视频
        time.sleep(1)
        all_li = driver.find_elements(By.XPATH,'//*[@id="all-list"]/div[1]/div[2]/ul[2]/li')
        # 判断空列表
        if all_li == []:
            all_li = driver.find_elements(By.XPATH, '//*[@id="all-list"]/div[1]/ul/li')
        elif all_li != []:
            all_li = driver.find_elements(By.XPATH,'//*[@id="all-list"]/div[1]/div[2]/ul[2]/li')
        time.sleep(1)
        for i in all_li:
            ditail = i.find_element(By.XPATH,'./div/div[1]/a').get_attribute('href')
            title = i.find_element(By.XPATH,'./div/div[1]/a').get_attribute('title')
            new_time = i.find_element(By.XPATH,'./div/div[3]/span[3]').text
            user = i.find_element(By.XPATH,'./div/div[3]/span[4]').text
            images = i.find_element(By.XPATH,'./a/div/div[1]/img').get_attribute('src')
            if images == '':
                images = 'https://i0.hdslb.com/bfs/archive/9974b552950679b49c0e73d10bd55c29fcec35b9.png@400w_250h_1c.webp'
            watch = i.find_element(By.XPATH,'./div/div[3]/span[1]').text
            item = {
                '标题': title,
                '详情页': ditail,
                '发布时间': new_time,
                'up博主': user,
                '图片': images,
                '观看次数': watch
            }
            print(item)
            all_data.append(item)
            save_Images(title,images)


        time.sleep(1)
        try:
            # 翻页
            net_page = driver.find_element(By.XPATH,'//*[@class="page-item next"]/button')
            net_page.click()
            time.sleep(3)
            num += 1
        except:
            break

    return all_data





def save_csv(all_data):
    df = pd.DataFrame(all_data)
    df.to_csv('哔哩.csv',index=False)



def save_Images(title,images):
    global page
    if not os.path.exists('./哔哩/'):
        os.mkdir('./哔哩/')
    response = requests.get(url=images).content
    with open('./哔哩/' + str(page) + '.jpg',mode='wb')as f:
        f.write(response)
        print('正在保存图片:' + title)
        page += 1




def mian():
    url = 'https://www.bilibili.com/'
    driver = get_serch(url)
    all_data = get_data(driver)
    save_csv(all_data)




if __name__ == '__main__':
    mian()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium自动化测试实战案例哔哩哔哩信息至Excel 的相关文章

随机推荐

  • Apache Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)

    1 产品简介 Kafka Connect是一种用于在Apache Kafka和其他系统之间可扩展且可靠地流式传输数据的工具 它使快速定义将大量数据移入和移出Kafka的连接器变得简单 Kafka Connect可以摄取整个数据库或从所有应用
  • STM32+SG90舵机详解(详细)

    上一次使用舵机只是草草了解 只大概知道是pwm控制的 这次又使用到了舵机 本以为复制上次代码就可以调试成功 没想到却弄了很久 我使用的是STM32f103c8t6 用的是定时器4 这个f1板子的定时器各个通道io口如下图所示 在开始之前我们
  • git push -u origin master

    1 错误描述 出错场景描述 github上创建远程仓库的时候选择添加README md文件 git bash连接远程库 然后执行push操作 出现下面的问题 git push u origin master To github com XX
  • Linux 下存放ssh信息的文件位置

    vi root ssh known hosts root prme stg dhcp1649 StorageJavaAuto cat root ssh known hosts prme stg188 eng vmware com 10 11
  • axure创建网页

    最近发现一个好玩的东西 就是axure了 学习操作了下 弄出了一个简单的搜狗页面还有登录界面 该有的交互也弄了些 感觉挺好玩的 也扒拉下生成了html 好好看看 代码可能有点长 你忍一下qwq
  • Ubuntu小技巧19--Kibana安装方法

    Ubuntu小技巧19 Kibana安装方法 Kibana 是一款开源的数据分析和可视化平台 它是 Elastic Stack 成员之一 设计用于和 Elasticsearch 协作 可以使用 Kibana 对 Elasticsearch
  • c++pointer踩坑记录 (std::move, shared_ptr)

    要实现的需求 拿到一个指向数据的void 指针 用这个指针替换旧对象数据 要求 不额外申请内存 我在这过程中搜过的问题 看的知识点 how to use enum in c use std move to pointer std vecto
  • ElasticSearch中字符串类型(Text和keyword)的选择

    ElasticSearch 5 0以后 字符串类型有重大变更 移除了string类型 string字段被拆分成两种新的数据类型 text和keyword text 会分词 然后进行索引 用于全文搜索 支持模糊 精确查询 不支持聚合 keyw
  • mysql深度剖析一(底层数据结构)

    衍变 二叉树 二叉查找树 容易形成链表 二叉平衡树 可以自动调整高度 但层数容易过高 多路平衡查找树即B树 层数控制了 但每个节点存有数据 导致每个磁盘页存不了多少索引 导致层数升高 传统加强版多路平衡查找树即B 树 每个磁盘页可以存更多索
  • 微服务 熔断示例_Istio作为何时不进行微服务的示例

    微服务 熔断示例 在过去的五年中 我在帮助企业进行云原生之旅方面投入了大量资金 现代化和提高团队 最终是组织 交付基于软件的技术的速度 很大程度上取决于其人员 流程和最终的技术决策 当应用程序体系结构的顶点已成为进行更改和 更快地进行 的瓶
  • 把ubuntu安装在U盘的教程之三:安装ubuntu系统在U盘中

    摘要 本文将详细讲解如何把U盘安装到U盘上 一 工具 1 一台电脑 2 一个U盘 用于安装ubuntu 注 要提前分好区 3 另一个U盘 制作好的ubuntu启动盘 二 安装ubuntu的图文教程 1 把两个U盘插进电脑 如果电脑有两个以上
  • linux运维基础视频教程免费分享!

    linux运维基础视频教程免费分享 linux运维即linux运维工程师 Linux是一套免费使用和自由传播的类Unix操作系统 是一个基于POSIX和UNIX的多用户 多任务 支持多线程和多CPU的操作系统 它能运行主要的UNIX工具软件
  • WPF的MVVM框架Stylet开发文档 17.设计模式支持

    17 设计模式支持 介绍 设计模式 或 设计时 是指当您的项目加载到 Visual Studio XAML 设计器或 Expression Blend 中时 您将看到 XAML 的渲染版本 大多数时候 设计者不会尝试评估您的任何绑定或为它们
  • ip、子网掩码、网关、默认网关

    这里写目录标题 ip 网络地址 主机地址 子网 子网掩码 子网掩码的表示方法 为什么要使用子网掩码 子网掩码的分类 网关 默认网关 ip ip地址 网络地址 主机地址 又称 网络号和主机号 我们把网络号相同的主机称之为本地网络中的主机 网络
  • JVM跨平台原理

    Java有一个其他语言都没有特点 那就是跨平台 跨平台是什么意思呢 我们首先来看看平台是指什么 平台就是指我们计算机的操作系统 例如 Windows Linux Mac等操作系统 跨平台的意思就是Java程序 在一次编译后 在这些平台上都可
  • 混淆技术研究-OLLVM混淆-控制流平坦化(FLA) - WIP

    简介 控制流平坦化通过将程序中的条件分支语句转化为等价的平铺控制流来实现 通常 这包括将原始的分支语句 如if语句 switch语句 中的每个分支提取出来 并将它们放置在一系列连续的基本块中 然后使用一个状态变量或标志来选择要执行的基本块
  • C++ 虚继承和多态性

    类体系的函数重载 在一个类中声明重载 派生类定义和基类同名 同参数的函数 即在派生类中重载 类指针的关系 基类指针指向基类对象 派生类指针指向派生类对象 基类指针指向派生类对象 派生类指针指向基类对象 基类指针可以直接指向派生类对象 但是使
  • 线程的锁问题

    1 公平锁与非公平锁 公平锁 排队进行 非公平锁 抢占式 同步代码块 同步方法都属于非公平锁 显式锁Lock可以指定是否为公平锁 true 公平锁 false 给公平锁 默认 private Lock l new ReentrantLock
  • 7.反引号 ` `

    1 反引号第一种使用情况 fun main 登录功能 2021年8月8日测试环境下 测试登录功能 需求编码人是Derry Derry 123456 private fun 登录功能 2021年8月8日测试环境下 测试登录功能 需求编码人是D
  • selenium自动化测试实战案例哔哩哔哩信息至Excel

    文章目录 前言 明确目标 最终效果 开发环境 思路分析 实现步骤 运行效果 以下是全部代码 前言 最近在B站学习知识 于是看完了视频就想着练习一下巩固一下知识 就地取材的做了个B站selenium小项目 感觉还挺适合新手入门的 于是迫不及待