首先声明我是我自己的账号信息,违法的事情我们不干。首先要展示的是我写的一个简易音乐搜集器,理论上是任何歌曲都可以。
先看效果: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的区别大家可以搜一下,小编不一一赘述了。
最后,制作不易,大家点点关注,点点赞呗。