本文共 2902 字,大约阅读时间需要 9 分钟。
作为一名计算机学院的大数据专业大三学生,我最近对网络爬取技术有了深入的学习。网易云音乐作为国内知名的音乐平台,其歌手信息资源丰富且分类详细。为了更好地了解网易云音乐的数据结构,我决定开发一个爬取歌手信息的 Python 脚本。
在开始编写代码之前,首先需要了解目标网页的数据结构。网易云音乐的网页版页面信息获取通常需要通过爬取网页源代码来实现。然而,直接访问网页版页面时,往往会遇到 iframe 标签的问题,这会导致爬虫难以获取到预期的数据。
经过实验发现,通过直接访问特定分类的 URL(如 https://music.163.com/discover/artist),可以获取到所需的分类信息。我们可以通过分析网页源代码,提取出歌手分类和对应的 URL。
通过观察网页源代码,可以发现每个分类都对应一个具体的 id。例如,华语男歌手对应的 id 是 1001,华语女歌手对应的 id 是 1002。通过这些 id 值,可以拼接出完整的爬取 URL。
针对每个分类,我们可以编写一个函数来获取对应的歌手信息。通过解析网页源代码,可以提取出歌手的名字和对应的链接。具体实现如下:
id 拼接到基础 URL 中,生成完整的爬取链接。结合以上分析,整理出完整的爬取代码如下:
import requestsfrom lxml import etreeimport csvimport timeimport random# 设置请求头headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}def parse_url(url): """解析 URL,获取响应内容""" time.sleep(random.random()) response = requests.get(url=url, headers=headers) return response.content.decode('utf-8')def parse_html(html): """使用 XPath 解析 HTML,返回 XPath 对象""" etree_obj = etree.HTML(html) return etree_objdef get_type_url(): """获取所有歌手分类""" types = [] start_url = "https://music.163.com/discover/artist" html = parse_url(start_url) etree_obj = parse_html(html) type_name_list = etree_obj.xpath('//a[@class="cat-flag"]/text()') type_url_list = etree_obj.xpath('//a[@class="cat-flag"]/@href') for name, url in zip(type_name_list, type_url_list): types.append({ 'name': name, 'url': url }) return typesdef get_data(url, type_name): """爬取歌手数据""" item = { 'type': type_name, 'name': '', 'url': '' } html = parse_url(url) etree_obj = parse_html(html) artist_name_list = etree_obj.xpath('//a[@class="nm nm-icn f-thide s-fc0"]/text()') artist_url_list = etree_obj.xpath('//a[@class="nm nm-icn f-thide s-fc0"]/@href') for name, url in zip(artist_name_list, artist_url_list): item['name'] = name item['url'] = f"{base_url}{url[1:]}" items.append(item)def save(): """将数据保存到 CSV 文件中""" with open("./wangyinyun.csv", 'a', encoding='utf-8') as file: writer = csv.writer(file) for item in items: writer.writerow(item.values())def start(): """启动爬虫""" types = get_type_url() for type_info in types: for initial in range(65, 91): url = f"{base_url}{type_info['url']}&initial={initial}" print(url) get_data(url, type_info['name']) save()if __name__ == '__main__': start() 运行上述代码后,可以看到爬取到的歌手信息会被保存到 wangyinyun.csv 文件中。通过检查爬取到的数据,可以发现分类信息和具体歌手信息都已正确获取。
通过本次项目,我深入了解了网易云音乐的数据结构,并掌握了使用 Python 脚本爬取网页信息的技巧。虽然过程中遇到了一些挑战,但通过不断实验和修改,最终成功实现了目标。下文会继续探讨更多有趣的网络爬取项目!
转载地址:http://kzwv.baihongyu.com/