爬虫代码修改,也可自己写达到要求

需要一个爬虫Python代码,爬取音乐,要求有详细注释,爬取后可以储存。也可对图片代码进行修改以实现要求,请运行后无误再回答,谢谢!图片代码运行后如图:

img

img

img

用浏览器访问看看是否也报错
这个错误信息可能是服务器反爬措施限制了,也可能是网络的问题,比如防火墙阻止了

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,可以正常获取到数据,如果不会的可以去学习下或者看我的博客,很简单的:

img


这个获取到的是网页的html,解析其中的数据即可。

使用 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}---下载成功')

代码说明:

  1. 发送请求,爬取网易云热门歌单中的音乐id
  2. 根据id重定向到真实音乐网页,获取歌曲名和歌手
  3. 拼接标题和歌手创建文件夹
  4. 获取音乐下载url,请求并下载音乐
  5. 保存音乐到相应文件夹,打印下载成功信息
  6. 添加详细注释,解释实现过程

这个爬虫代码实现了对网易云热门歌单音乐的爬取与储存。可以根据需要修改offset和limit设置爬取数量。也可以修改headers等信息避开限制。