博客
关于我
一文带你快速爬取网易云音乐,就是这么简单!
阅读量:220 次
发布时间:2019-03-01

本文共 2902 字,大约阅读时间需要 9 分钟。

网易云音乐歌手爬取 Python 脚本

作为一名计算机学院的大数据专业大三学生,我最近对网络爬取技术有了深入的学习。网易云音乐作为国内知名的音乐平台,其歌手信息资源丰富且分类详细。为了更好地了解网易云音乐的数据结构,我决定开发一个爬取歌手信息的 Python 脚本。

一、爬取方法探索

在开始编写代码之前,首先需要了解目标网页的数据结构。网易云音乐的网页版页面信息获取通常需要通过爬取网页源代码来实现。然而,直接访问网页版页面时,往往会遇到 iframe 标签的问题,这会导致爬虫难以获取到预期的数据。

经过实验发现,通过直接访问特定分类的 URL(如 https://music.163.com/discover/artist),可以获取到所需的分类信息。我们可以通过分析网页源代码,提取出歌手分类和对应的 URL。

二、分类信息获取

通过观察网页源代码,可以发现每个分类都对应一个具体的 id。例如,华语男歌手对应的 id1001,华语女歌手对应的 id1002。通过这些 id 值,可以拼接出完整的爬取 URL。

三、爬取歌手数据

针对每个分类,我们可以编写一个函数来获取对应的歌手信息。通过解析网页源代码,可以提取出歌手的名字和对应的链接。具体实现如下:

  • 解析分类信息:通过 XPath 表达式提取出所有分类信息。
  • 拼接爬取 URL:将分类 id 拼接到基础 URL 中,生成完整的爬取链接。
  • 解析歌手信息:通过解析每个分类页面的网页源代码,提取出具体的歌手名字和对应的链接。
  • 四、完整代码实现

    结合以上分析,整理出完整的爬取代码如下:

    import requests
    from lxml import etree
    import csv
    import time
    import 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_obj
    def 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 types
    def 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/

    你可能感兴趣的文章
    noi 1996 登山
    查看>>
    noi 7827 质数的和与积
    查看>>
    NOI-1.3-11-计算浮点数相除的余数
    查看>>
    NOI2010 海拔(平面图最大流)
    查看>>
    NOIp2005 过河
    查看>>
    NOIP2011T1 数字反转
    查看>>
    NOIP2014 提高组 Day2——寻找道路
    查看>>
    noip借教室 题解
    查看>>
    NOIP模拟测试19
    查看>>
    NOIp模拟赛二十九
    查看>>
    Vue3+element plus+sortablejs实现table列表拖拽
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    non linear processor
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>
    NoNodeAvailableException None of the configured nodes are available异常
    查看>>
    Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
    查看>>
    nopcommerce商城系统--文档整理
    查看>>
    NOPI读取Excel
    查看>>