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

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

猜你喜欢

转载自blog.csdn.net/m0_73731708/article/details/129329126