纯小白,为了毕设爬音乐信息数据,搞了好几天,终于搞出来个能用的代码
把各路大佬的代码东拼西凑,我都找不到是用的谁的了,最后自己学着重写了一份
顺序爬,太慢了,而且会出“ Keyerro:*** ”的错,搞不懂,尝试多线程,还不太会用,能爬到数据但写不进去,希望有大佬能帮忙,我实在是太菜了
"""
********************************************************************************
* 爬取网易云音乐数据
* 整体思路:
* 发现音乐页面的歌手页面起
* 及:https://music.163.com/#/discover/artist
* 以以上为跳板爬取页面歌手的url
* (剔除推荐,从华语男歌手开始爬取)
* (华语男歌手中再剔除热门,从 A ~ Z 及其它)
* 例如:https://music.163.com/#/artist?id=16152
* 依据上所爬取的歌手url,进入歌手页面爬取歌曲信息可及歌曲url
* 例如:https://music.163.com/#/song?id=536623501
*
* 可进一步爬取歌词,音乐等信息
* 或再根据歌曲url爬取歌曲下面评论对其拓展
*
********************************************************************************
"""
import requests, json
from lxml import etree
from bs4 import BeautifulSoup
import pandas as pd
import cloudmusic
#多线程尝试
from threading import Thread
import time
# 发现音乐页面的歌手页面的url
artist_s_url = 'https://music.163.com/discover/artist'
singer_infos = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}
columns = ['song_id', 'song_name', 'song_artist', 'album', 'albumId', 'size', 'type', 'count_num', 'song_url']
# ---------------通过url获取该页面的内容,返回xpath对象
def get_xpath(url):
response = requests.get(url, headers=headers)
return etree.HTML(response.text)
# --------------通过get_xpath爬取到页面后,我们获取华宇,华宇男等分类生成列表
def catch_fenlei_list():
artist_s_html = get_xpath(artist_s_url)
sort_url_list = artist_s_html.xpath('//ul[@class="nav f-cb"]/li/a/@href') # 获取华宇等分类的url
# print(fenlei_url_list)
# 以上print结果截取'/discover/artist/', '/discover/artist/signed/', '/discover/artist/cat?id=1001', '/discover/artist/cat?id=1002'
# --------将热门和推荐两栏去掉筛选,通过上面结果可知热门和推荐没有'id'字段
clear_sort_url_list = [i for i in sort_url_list if 'id' in i]
# print(new_list)
return clear_sort_url_list
# -------------通过传入的分类url,获取A~Z+其它 的列表
def catch_letter_list(sort_url):
sort_html = get_xpath(sort_url)
# 获得字母排序,每个字母的链接
letter_url_list = sort_html.xpath('//ul[@id="initial-sel