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