源码已在本人博客记录
https://www.wouldmissyou.com
代码随便写的,大神勿喷!
安装依赖:
pip install beautifulsoup4 requests tqdm tabulate
截图:
Xnip2023-04-18_10-52-18.jpg (187.74 KB, 下载次数: 0)
下载附件
2023-4-18 10:52 上传
源码:
[Python] 纯文本查看 复制代码
import re
import requests
from bs4 import BeautifulSoup
from tabulate import tabulate
from tqdm import tqdm
def save_file(file_path, file_title, file, file_pbar):
"""
保存文件
:param file_path: 保存文件的路径
:param file_title: 保存文件的名称
:return:
"""
with open(file_path, mode='wb') as f:
for file_chunk in file.iter_content(1024 * 512):
f.write(file_chunk)
file_pbar.set_description(f'正在下载{file_title}音频中。。。')
file_pbar.update(1024 * 512)
file_pbar.set_description(f"{file_title}下载完成")
file_pbar.close()
def main(input_name):
"""
:param input_name: 输入的字符:歌曲名称或歌手名
:return:
"""
if not input_name:
return
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.46"
}
# 请求链接
base_url = "https://www.gequbao.com"
# 请求参数
url = "%s/s/%s" % (base_url, input_name)
response = requests.get(url=url, headers=headers)
if response.status_code != 200:
print("网络请求失败!请稍后重试!")
return
pattern = r'
(.*?) |
html_list = re.findall(pattern, response.text, re.DOTALL)
if not html_list:
print("解析失败,请重试!")
return
# 使用Beautiful Soup解析HTML
soup = BeautifulSoup(html_list[0], 'html.parser')
# 提取歌名、歌手和链接,并添加序号
data = []
# 保存另一个文件,方便下载
json_data = []
for idx, row in enumerate(soup.find_all('tr'), start=1):
cells = row.find_all('td')
if len(cells) == 3:
song_name = cells[0].text.strip()
artist = cells[1].text.strip()
link = cells[0].find('a')['href']
data.append({'序号': idx - 1, '歌名': song_name, '歌手': artist, '链接': link}) # idx-1 是为了让序号从1开始
json_data.append({"idx": idx - 1, "song_name": song_name, "artist": "artist", "link": link})
if not json_data:
print("未找到此歌曲或歌手的相关信息")
return
# 打印JSON数据的表格形式,设置表格格式为grid,并调整数字和字符串对齐方式
print(tabulate(data, headers='keys', tablefmt='grid', numalign='center', stralign='left'))
while True:
download_num = str(input("请输入要下载歌曲的序号(输入'0'则下载全部):"))
if int(download_num) > len(json_data) or int(download_num)