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的区别大家可以搜一下,小编不一一赘述了。

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

相关文章
|
1月前
|
Web App开发 前端开发 测试技术
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
|
4月前
|
数据采集 Web App开发 存储
Selenium库编写爬虫详细案例
Selenium库编写爬虫详细案例
|
6月前
|
Web App开发 Java 测试技术
21.9 Python 使用Selenium库
Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也可以用于其他用途,如爬取网站数据、自动化提交表单等。Selenium支持多种编程语言,如Java、Python、C#等,同时也支持多种浏览器,如Chrome、Firefox、Safari等。
52 0
21.9 Python 使用Selenium库
|
7月前
|
存储 搜索推荐 数据挖掘
使用selenium库模拟浏览器行为,获取网页的cookie值
使用selenium库模拟浏览器行为,获取网页的cookie值
|
2天前
|
Java 测试技术 持续交付
深入理解与应用Selenium WebDriver进行自动化测试
【4月更文挑战第25天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速市场发布的关键步骤。Selenium WebDriver作为业界广泛采用的自动化测试工具之一,提供了一种灵活且高效的方式来模拟用户与Web应用程序交互。本文将探讨Selenium WebDriver的核心概念、架构以及实际应用中的技巧和最佳实践。通过深入分析其工作原理及常见问题解决方案,旨在帮助测试工程师提升测试效率,确保测试结果的准确性和可靠性。
|
4月前
|
移动开发 安全 测试技术
『App自动化测试之Appium应用篇』| 继承于selenium常用的元素定位方法有哪些?如何使用?
『App自动化测试之Appium应用篇』| 继承于selenium常用的元素定位方法有哪些?如何使用?
84 0
|
28天前
|
Web App开发 Java 测试技术
深入理解与应用软件自动化测试工具Selenium
随着软件开发的快速发展,软件测试在保证产品质量方面发挥着越来越重要的作用。其中,自动化测试以其效率高、成本低的特点受到了广大开发者的欢迎。本文主要介绍了自动化测试工具Selenium的基本概念、原理以及在实际开发中的应用,旨在帮助读者更好地理解和使用Selenium进行高效的自动化测试。
22 4
|
5月前
|
JavaScript 数据安全/隐私保护
Selenium+JQuery定位方法及应用
Selenium+JQuery定位方法及应用
44 0
|
8月前
|
Web App开发 JSON 数据库
如何使用Python的Selenium库进行网页抓取和JSON解析
如何使用Python的Selenium库进行网页抓取和JSON解析
|
Web App开发 Python
使用Python和Selenium库实现饭圈自动化投票
饭圈文化是一种由热爱和支持自己喜欢的偶像所构成的文化。在这个文化中,粉丝们通常会通过多种方式来表达他们的爱意,例如关注偶像参与的综艺和电视剧,使用各种社交平台为偶像打榜投票,以争取让偶像获得更高的排名和更多的曝光。可以自动遍历HTML表格并找到“投票”链接进行单击,从而实现不同用户的自动化投票
152 0

热门文章

最新文章