selenium库应用

简介: selenium库应用

先声明我是我自己的账号信息,违法的事情我们不干。首先要展示的是我写的一个简易音乐搜集器,理论上是任何歌曲都可以。

先看效果:QQ录屏20230304005215

from selenium import webdriver
import requests
import json
import os
def music_listing():
    option = webdriver.ChromeOptions()  # 定义<selenium.webdriver.chrome.options.Options object at 0x000001C0B5B3DBD0>对象
    head = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36"
                          " (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 Edg/107.0.1418.35"}
    # 头,伪装成浏览器
    option.add_argument('--headless')  # 浏览器不提供可视化设备
    option.add_argument('--no--sandbox')  # 最高权限
    option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 开发者模式
    diver = webdriver.Chrome(options=option)
    # diver.implicitly_wait(3)
    diver.get(url='某狗网站 打上过不了审核')
    # time.sleep(20)
    # with open("cooks.txt",'w') as f:
    #     f.write(json.dumps(diver.get_cookies()))
    # diver.close()
    with open("cooks.txt", 'r') as f:
        a = json.load(f)
        for i in a:
            diver.add_cookie(i)
    diver.refresh()  # 刷新浏览器
    name = input("请输入你要听的歌曲名字:")
    c = diver.find_element_by_xpath("/html/body/div[1]/div/div[1]/div/input").send_keys(name)
    d = diver.find_element_by_xpath("/html/body/div[1]/div/div[1]/div/div[3]").click()
    num = 1
    while True:
        try:
            e = diver.find_element_by_xpath(f"/html/body/div[4]/div[1]/div[2]/ul[2]/li[{num}]/div[1]/a").text
            print(num, e, sep='   ')
            num += 1
        except:
            break
    number = int(input("请输入你要听的版本:"))
    t = diver.find_element_by_xpath(f"/html/body/div[4]/div[1]/div[2]/ul[2]/li[{number}]").click()
    # l=WebDriverWait(t,10,0.5).until(EC.presence_of_element_located((By.ID,'myAudio')))
    # 获取打开的多个窗口句柄
    windows = diver.window_handles
    #以列表形式存储
    # 切换到当前最新打开的窗口
    diver.switch_to.window(windows[-1])
    # get_attribute('textContent')会获取标签之间的文本内容。.text
    # get_attribute('innerHTML')会获取标签之间的完整html
    # get_attribute('outerHTML')获取当前标签的完整html
    # get_attribute('属性名')获得属性
    f = diver.find_element_by_xpath("/html/body/div[1]/audio").get_attribute('src')
    print(f)
    g = requests.get(url=f, headers=head)
    with open(r"D:\Orenge\music\a.mp3", "wb") as ff:
        ff.write(g.content)
        # 二进制写入
    diver.quit()
    # # 关闭浏览器
    os.system(r"start D:\Orenge\music\a.mp3")
if __name__ == '__main__':
    while True:
        music_listing()

这个没有歌词,那咋办呢?写一个呗

运行效果:

带歌词音乐

import requests
from lxml import etree
import pandas as pd
import os
import json
from selenium import webdriver
import time
def pa(url,dijibang):
    url_1 = []
    # paiming = []
    music_name = ''
    head = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36"
                          " (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 Edg/107.0.1418.35"}
    # 头,伪装成浏览器
    a = requests.get(url, headers=head)
    #a为页面源代码
    b = etree.HTML(a.text)
    # 产生对象,b是地址
    c = b.xpath("/html/body/div[3]/div/div[2]/div/div[2]/div[2]/ul")
    # 找到每个歌曲页面位置
    title_name=b.xpath("/html/body/div[3]/div/div[2]/div/div[1]/div/h3/text()")
    #爬取榜单名字
    for i in c:
        music_name = i.xpath("./li/@title")
        # 歌曲名字
        # paiming=i.xpath("./li/span[3]/strong/text()")
        # print(paiming)
        # p = i.xpath("./li/span[3]/text()")
        # for j in p:
        #     list_1.append(j.strip())
        url_1 = i.xpath("./li/a/@href")
        # 每个歌曲的url
    list_1 = [i for i in range(1, len(music_name) + 1)]
    #根据名字个数来产生排名
    print(" "*10,dijibang,title_name[0],sep='   ')
    #打印榜单号和名字
    for i in range(len(list_1)):
        print(list_1[i], music_name[i], sep='   ')
        #打印每个排名和对应歌曲名字
    print('*'*70)
    return music_name,list_1,url_1,title_name
#创建解析对象
#b是地址,c=etree.tostring(b).decode("utf-8")转为字符串
def tingge(url):
    option = webdriver.ChromeOptions()  #定义<selenium.webdriver.chrome.options.Options object at 0x000001C0B5B3DBD0>对象
    #配置chrom启动属性的类
    # 二进制文件位置(binary_location)
    # 添加启动参数(add_argument)
    # 添加扩展应用(add_extension, add_encoded_extension)
    # 添加实验性质的设置参数(add_experimental_option)
    # 设置调试器地址(debugger_address)
    head = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36"
                          " (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 Edg/107.0.1418.35"}
    # 头,伪装成浏览器
    option.add_argument('--headless')   #浏览器不提供可视化设备
    option.add_argument('--no--sandbox')#最高权限
    option. add_experimental_option('excludeSwitches', ['enable-automation']) #开发者模式
    # 添加UA
    # options.add_argument(
    #     'user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
    # options.add_argument('--disable-infobars')  # 禁止策略化
    # options.add_argument('--no-sandbox')  # 最高权限
    # options.add_argument('window-size=1920x3000')  # 指定浏览器分辨率
    # options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
    # options.add_argument('--incognito')  # 隐身模式(无痕模式)
    # options.add_argument('--disable-javascript')  # 禁用javascript
    # options.add_argument('--start-maximized')  # 最大化运行(全屏窗口),不设置,取元素会报错
    # options.add_argument('--disable-infobars')  # 禁用浏览器正在被自动化程序控制的提示
    # options.add_argument('--hide-scrollbars')  # 隐藏滚动条, 应对一些特殊页面
    # options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
    # options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
    # options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"  # 手动指定使用的浏览器位置
    # 禁止加载图片
    # prefs = {"profile.managed_default_content_settings.images": 2}
    # options.add_experimental_option("prefs", prefs)
    #禁用弹窗
    # prefs = {'profile.default_content_setting_values': {'notifications': 2}}
    # options.add_experimental_option('prefs', prefs)
    diver = webdriver.Chrome(options=option)
    diver.get(url=url)
    # time.sleep(20)
    # with open("cooks.txt",'w') as f:
    #     f.write(json.dumps(diver.get_cookies()))
    # diver.close()
    with open("cooks.txt", 'r') as f:
        a = json.load(f)
        for i in a:
            diver.add_cookie(i)
            #diver.get_cookies() 获取cookie
            #diver.delete_all_cookies()清空原来cookie
            # json.dumps()将Python对象编码成JSON字符串
            # json.loads()将已编码的JSON字符串解码为Python对象
            # json.dump()将Python内置类型序列化为json对象后写入文件
            # json.load()读取文件中json形式的字符串元素转化为Python类型
    diver.refresh()   #刷新浏览器
    c = diver.find_element_by_xpath("/html/body/div[1]/audio").get_attribute('src')
    # get_attribute('textContent')会获取标签之间的文本内容。.text
    # get_attribute('innerHTML')会获取标签之间的完整html
    # get_attribute('outerHTML')获取当前标签的完整html
    #get_attribute('属性名')获得属性
    d = requests.get(url=c, headers=head)
    with open(r"D:\Orenge\music\a.mp3", "wb") as f:
        f.write(d.content)
        #二进制写入
    os.system(r"start D:\Orenge\music\a.mp3")
    diver.quit()
    #关闭浏览器
def li():
    url="某狗网站 打上不过审"
    #url
    head = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36"
                          " (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 Edg/107.0.1418.35"}
    # 头,伪装成浏览器
    a = requests.get(url, headers=head)
    #发送get请求,返回值为a,a为迭代器也就是地址
    b = etree.HTML(a.text)
    #将a转为字符串后再创建<class 'lxml.etree._Element'>对象
    c=b.xpath("/html/body/div[3]/div/div[1]/div[1]/ul/li/a/@href")
    #通过xpath获得所有榜单的url<class 'list'>
    return c
def geci(url):
    option = webdriver.ChromeOptions()
    head = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36"
                          " (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 Edg/107.0.1418.35"}
    # 头,伪装成浏览器
    option.add_argument('--headless')  # 浏览器不提供可视化设备
    option.add_argument('--no--sandbox')  # 最高权限
    option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 开发者模式
    diver = webdriver.Chrome(options=option)
    diver.get(url=url)
    # time.sleep(20)
    # with open("cooks.txt",'w') as f:
    #     f.write(json.dumps(diver.get_cookies()))
    # diver.close()
    with open("cooks.txt", 'r') as f:
        a = json.load(f)
        for i in a:
            diver.add_cookie(i)
    diver.refresh()  # 刷新浏览器
    num=3
    while True:
        try:
            mm = diver.find_element_by_xpath(f"/html/body/div[1]/div[3]/div[1]/div[2]/div[4]/div/div/p[{num}]").get_attribute(
                'textContent')
            print(mm,end='')
            print("-_-_-"*5)
            time.sleep(0.7)
            num+=1
        except:
            break
if __name__ == '__main__':
    a=1
    list=[]
    list_urla= li()
    #list_url所有榜单的url1
    for url in list_urla:
        #遍历每个榜单的url
        music_name,list_1,url_1,title_name=pa(url,a)
        #名字         排名   url      榜单名,都是列表形式
        list.append(url_1)
        #将每个url_1加到list列表中,注意url_1是列表,list为二维列表
        a+=1
        #记录榜单的个数
        dataframe = pd.DataFrame(data={"music_index": list_1, "name": music_name})
        #pd.DataFrame( data, index, columns, dtype, copy)
        # data输入的数据,可以是ndarray,series,list,dict,标量以及一个DataFrame。
        # index行标签,如果没有传递index值,则默认行标签是np.arange(n),n代表data的元素个数。
        # columns列标签,如果没有传递columns值,则默认列标签是np.arange(n)。
        # dtypedtype表示每一列的数据类型。
        # copy默认为False,表示复制数据data。
        #DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None,
        # columns=None, header=True, index=True, index_label=None, mode='w', encoding=None,
        # compression='infer', quoting=None, quotechar='"', line_terminator=None,
        # chunksize=None, date_format=None, doublequote=True, escapechar=None, decimal='.',
        # errors='strict')
        dataframe.to_csv(rf"C:\Users\HP\Desktop\Python\{title_name[0]}.csv", index=True, sep=',')
        name_file = open(rf"C:\Users\HP\Desktop\Python\{title_name[0]}.txt", 'w', encoding='utf-8')
        name_s = ''
        for i in music_name:
            name_s += i
        name_file.write(name_s)
        name_file.close()
    now_time = time.time()
    #获得当前时间戳
    now_time = time.localtime(now_time)
    print('%d-%d-%d' % (now_time[0], now_time[1], now_time[2]))
    while True:
        numbera = int(input("请输入想听的榜单:"))
        number=int(input("请输入想听的歌曲排名:"))
        print("正在下载请稍后..........")
        tingge(list[numbera-1][number-1])
        print("-"*70)
        geci(list[numbera-1][number-1])

有朋友问了这是怎么做到的,其实就是利用cookie绕过登录而已,cookie和session的区别大家可以搜一下,小编不一一赘述了。

最后,制作不易,大家点点关注,点点赞呗。

相关文章
|
6月前
|
Web App开发 前端开发 测试技术
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
|
6月前
|
数据采集 Web App开发 存储
Selenium库编写爬虫详细案例
Selenium库编写爬虫详细案例
|
Web App开发 Java 测试技术
21.9 Python 使用Selenium库
Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也可以用于其他用途,如爬取网站数据、自动化提交表单等。Selenium支持多种编程语言,如Java、Python、C#等,同时也支持多种浏览器,如Chrome、Firefox、Safari等。
81 0
21.9 Python 使用Selenium库
|
存储 搜索推荐 数据挖掘
使用selenium库模拟浏览器行为,获取网页的cookie值
使用selenium库模拟浏览器行为,获取网页的cookie值
|
6月前
|
设计模式 安全 测试技术
深入理解与应用自动化测试框架 — 以Selenium为例网络防线的构筑者:洞悉网络安全与信息安全的核心要素
【5月更文挑战第29天】 在快速迭代的软件开发过程中,自动化测试已成为提高测试效率、确保软件质量的重要手段。本文将深入探讨自动化测试框架Selenium的核心概念、架构以及实际应用中的关键技巧,旨在为读者提供一篇系统性的分析与实践指南。文章首先概述了自动化测试的必要性和Selenium框架的基本特征;随后详细剖析了Selenium的组件结构,并结合实例讲解如何高效地设计和执行测试用例;最后,讨论了当前自动化测试面临的挑战及未来发展趋势。
|
6月前
|
JSON 数据管理 测试技术
自动化测试工具Selenium Grid的深度应用分析深入理解操作系统的内存管理
【5月更文挑战第28天】随着互联网技术的飞速发展,软件测试工作日益复杂化,传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势,为测试工程师提供高效测试解决方案的参考。
|
6月前
|
敏捷开发 监控 IDE
深入理解自动化测试工具Selenium的工作原理与实践应用
【5月更文挑战第26天】 随着敏捷开发和持续集成理念的普及,自动化测试在软件开发生命周期中扮演了至关重要的角色。Selenium作为最流行的自动化测试工具之一,以其开源、跨平台和支持多种编程语言的特性被广泛使用。本文将详细解析Selenium的核心组件,探讨其工作原理,并通过案例分析展示如何高效地实施Selenium进行Web应用的自动化测试。我们将从测试准备到结果分析的全过程,提供一系列实用的策略和最佳实践,帮助读者构建和维护一个健壮的自动化测试环境。
|
6月前
|
敏捷开发 IDE 测试技术
深入探索自动化测试工具Selenium的高效应用
【5月更文挑战第23天】 在快速演进的数字时代,软件开发周期不断缩短,而质量保证的需求却日益增加。自动化测试作为确保软件质量的关键手段之一,其重要性不言而喻。Selenium作为一种广泛使用的自动化测试工具,因其跨平台、多语言支持和开源等特性,在业界得到了广泛应用。本文将深入分析Selenium的核心功能,探讨其在真实项目中的应用策略,并通过案例分析展示如何通过Selenium提高测试效率和准确性。
|
6月前
|
移动开发 安全 测试技术
『App自动化测试之Appium应用篇』| 继承于selenium常用的元素定位方法有哪些?如何使用?
『App自动化测试之Appium应用篇』| 继承于selenium常用的元素定位方法有哪些?如何使用?
194 0
|
6月前
|
敏捷开发 Java 测试技术
探索自动化测试工具Selenium Grid的高效应用
【4月更文挑战第21天】 随着敏捷开发和持续集成的理念深入人心,自动化测试已成为软件开发过程中不可或缺的一环。本文将深入探讨如何利用Selenium Grid进行高效的自动化测试。通过分析其工作原理,搭建过程,以及在实际项目中的应用案例,揭示Selenium Grid在处理大规模并发测试中的潜力和优势。文章不仅提供了具体的操作步骤,还讨论了优化策略,帮助读者构建更加稳定和高效的自动化测试环境。