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

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

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

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

一、爬取方法探索

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

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

二、分类信息获取

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

三、爬取歌手数据

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

  • 解析分类信息:通过 XPath 表达式提取出所有分类信息。
  • 拼接爬取 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/

    你可能感兴趣的文章
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS网络文件系统
    查看>>
    nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
    查看>>
    ng 指令的自定义、使用
    查看>>
    Nginx
    查看>>
    nginx + etcd 动态负载均衡实践(二)—— 组件安装
    查看>>
    nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
    查看>>
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>