需要一个爬虫Python代码,爬取音乐,要求有详细注释,爬取后可以储存。也可对图片代码进行修改以实现要求,请运行后无误再回答,谢谢!图片代码运行后如图:
用浏览器访问看看是否也报错
这个错误信息可能是服务器反爬措施限制了,也可能是网络的问题,比如防火墙阻止了
from urllib.request import urlopen
import urllib.parse
import json # 导入json模块,为了使下载的js文件更容易得到所需的信息
import time
import sys
import os
# 导入sys和time模块是为了显示进度条
def Time_1(): # 进度条函数
for i in range(1, 51):
sys.stdout.write('\r')
sys.stdout.write('{0}% |{1}'.format(int(i % 51) * 2, int(i % 51) * '■'))
sys.stdout.flush()
time.sleep(0.125)
sys.stdout.write('\n')
def KuGou_music():
keyword = urllib.parse.urlencode({'keyword': input('请输入歌名:')})
keyword = keyword[keyword.find('=') + 1:]
url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery1124042761514747027074_1580194546707&keyword=' + keyword + '&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1580194546709'
content = urlopen(url=url)
content = content.read().decode('utf-8')
str_1 = content[content.find('(') + 1:-2]
str_2 = json.loads(str_1)
Music_Hash = {}
Music_id = {}
for dict_1 in str_2['data']['lists']:
Music_Hash[dict_1['FileName']] = dict_1['FileHash']
Music_id[dict_1['FileName']] = dict_1['AlbumID']
# print(dict_1)
list_music_1 = [music for music in Music_Hash] # 匹配到的所有歌曲名 列表
list_music = [music for music in Music_Hash]
for i in range(len(list_music)):
if '- <em>' in list_music[i]:
list_music[i] = list_music[i].replace('- <em>', '-')
if '</em>' in list_music[i]:
list_music[i] = list_music[i].replace('</em>', '')
if '<em>' in list_music[i]:
list_music[i] = list_music[i].replace('<em>', '')
# 使歌曲名称更加美观
# 如: < em > 战狼 < / em > - 断情笔 经过这个处理之后 战狼 - 断情笔
for i in range(len(list_music)):
print("{}-:{}".format(i + 1, list_music[i]))
music_id_1 = int(input('请输入你想下载的歌曲序号:'))
# 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=E77548A33D7AF84F727C32A786C107D0&album_id=542163&dfid=2SSV0x4LWcsx0iylej1F6w7P&mid=44328d3dc4bfce21cf2b95cf9e76b968&platid=4'
# 一个加载js文件的标椎式样网址
url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=' + Music_Hash[
list_music_1[music_id_1 - 1]] + '&album_id=' + Music_id[list_music_1[
music_id_1 - 1]] + '&dfid=2SSV0x4LWcsx0iylej1F6w7P&mid=44328d3dc4bfce21cf2b95cf9e76b968&platid=4'
js_content = urlopen(url=url)
str_3 = js_content.read().decode('utf-8') # 所加载的js中的内容
dict_2 = json.loads(str_3) # 将这个js格式转换成为字典格式
try:
music_href = dict_2['data']['play_backup_url'] # 下载的歌曲网址
music_content = urlopen(url=music_href).read()
try:
os.mkdir('D:\酷狗音乐下载')
except Exception as e:
print(e, '但不要紧,程序仍然执行')
finally:
music_path = 'D:\酷狗音乐下载\\' + list_music[music_id_1 - 1] + '.mp3' # 歌曲下载路径
with open(music_path, 'wb') as f:
print('正在下载当中...')
f.write(music_content)
Time_1()
print('{}.mp3下载成功!'.format(list_music[music_id_1 - 1]))
except:
print('对不起,没有该歌曲的版权!')
if __name__ == '__main__':
print('------声明:本小程序仅供娱乐,切莫用于商业活动,一经发现,概不负责!-------')
print('------声明:本小程序仅供娱乐,切莫用于商业活动,若使用者用于商业活动,与代码编写者无关!-------')
KuGou_music()
酷狗那边把你拦截了。解决方法如下
加个代理
构建假的cookie和useragent
那个获取页面的else里面加个sleep等待
你的请求链接https://www.kugou.com/#/search/....
那里有问题,你手动复制到浏览器访问,发现不是歌手的搜索页面,所以这个请求链接是不对的。你应该在该网站的搜索界面搜索歌手后,把当前浏览器的地址作为你的请求数据的链接。正确的url应该为:
urL = 'https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord={}'.format (keyword)
其次,直接访问这个链接会被该网站反爬,建议使用selenium,可以正常获取到数据,如果不会的可以去学习下或者看我的博客,很简单的:
使用 Python 爬取音乐的示例代码
import requests
from bs4 import BeautifulSoup
import os
# 定义要爬取的 URL 和存储路径
url = 'https://www.xiami.com/chart'
path = './music/'
# 如果存储路径不存在,则创建
if not os.path.exists(path):
os.makedirs(path)
# 发送 HTTP 请求,获取网页内容
response = requests.get(url)
html = response.text
# 使用 BeautifulSoup 解析网页内容
soup = BeautifulSoup(html, 'html.parser')
# 查找所有的音乐元素
music_list = soup.find_all('div', {'class': 'song'})
# 遍历音乐元素,获取音乐信息并下载
for music in music_list:
# 获取音乐名和歌手名
name = music.find('div', {'class': 'song-name'}).text.strip()
artist = music.find('div', {'class': 'singer'}).text.strip()
filename = name + ' - ' + artist + '.mp3'
# 获取音乐下载链接
download_url = music.find('a', {'class': 'download'})['href']
download_response = requests.get(download_url)
# 保存音乐文件
with open(path + filename, 'wb') as f:
f.write(download_response.content)
print('下载完成:', filename)
使用 requests 库来发送 HTTP 请求,使用 BeautifulSoup 库来解析网页内容。它首先定义了要爬取的 URL 和存储路径,然后发送 HTTP 请求并解析网页内容。接着,它查找所有的音乐元素,并遍历这些元素,获取音乐信息和下载链接,然后下载并保存音乐文件。最后,它输出下载完成的信息。
参考一下代码。
import requests
from bs4 import BeautifulSoup
import csv
# 设置请求头信息
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
# 目标网站 URL
url = 'https://www.xxxxxx.com/' # 这里替换成你要爬取的音乐网站的 URL
# 发送 GET 请求并获取内容
response = requests.get(url, headers=headers)
content = response.text
# 使用 Beautiful Soup 解析网页内容
soup = BeautifulSoup(content, 'html.parser')
# 定位要爬取的内容所在的 HTML 标签
songs = soup.find_all('div', class_='song-list-item') # 示例
# 创建 CSV 文件并写入表头
with open('songs.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerow(['歌曲', '歌手', '专辑'])
# 循环遍历每个 HTML 标签,获取所需数据并写入 CSV 文件
for song in songs:
# 获取歌曲、歌手、专辑名称
song_name = song.find('div', class_='song-name').text.strip()
artist_name = song.find('div', class_='artist-name').text.strip()
album_name = song.find('div', class_='album-name').text.strip()
# 将数据写入 CSV 文件
writer.writerow([song_name, artist_name, album_name])
print('爬取完成!')
答案由GPT-4Plus大模型(语音)与博主@晓码自在合作编写:
这里是一个爬取网易云音乐并储存的Python爬虫代码,包含详细注释:
python
import requests
from bs4 import BeautifulSoup
import os
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
# 采集音乐id,重定向到真实音乐的url
for i in range(3):
url = f'https://music.163.com/#/discover/playlist?order=hot&cat={i+1}&limit=35&offset={i * 35}'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
ids = soup.select('ul > li > div > div > a')
for id in ids:
music_url = f'https://music.163.com/song?id={id["href"][9:]}'
music_response = requests.get(music_url, headers=headers)
music_soup = BeautifulSoup(music_response.text, 'html.parser')
# 获取歌曲名和歌手
title = music_soup.select('em.f-ff2')[0].text
artist = music_soup.select('span.txt > a')[0].text
# 将标题和歌手拼接创建文件夹
dir_name = title + '--' + artist
if not os.path.exists(dir_name):
os.mkdir(dir_name)
# 获取音乐url并下载
download_url = f'http://music.163.com/song/media/outer/url?id={id["href"][9:]}.mp3'
download_response = requests.get(download_url, headers=headers)
# 保存音乐
with open(f'{dir_name}/{title}.mp3', 'wb') as f:
f.write(download_response.content)
print(f'歌曲:{title}---歌手:{artist}---下载成功')
代码说明:
这个爬虫代码实现了对网易云热门歌单音乐的爬取与储存。可以根据需要修改offset和limit设置爬取数量。也可以修改headers等信息避开限制。