爬虫入门经典(十) | 一文带你快速爬取网易云音乐

不温卜火 等级 583 0 0
标签: picPython

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/爬虫入门经典(十) | 一文带你快速爬取网易云音乐

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!

目录


爬虫入门经典(十) | 一文带你快速爬取网易云音乐


推荐

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
前几篇博文,爬取的都是比较常规的网站。大家是不是都有点腻了呢?如果大家感觉腻了的话,博主此次带来的比较新奇的内容。如果大家没有腻的话,当我没说。话不多说,网抑云时间到了!

爬虫入门经典(十) | 一文带你快速爬取网易云音乐

一、URL分析

在此,博主爬取的是网易云网页版,因为一般网页版都是最好爬取的,不要问我为什么,问就是不会!
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

网易云网页版链接:https://music.163.com/
歌手信息链接:https://music.163.com//discover/artist

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
但是由上图我们可以看出,虽然直接给出了网页链接,但是我们通过查看网页源代码,发现我们想要爬取的信息并没有在这个网页中。

这个时候,我们就需要通过Sreach查找歌手信息,从而得到我们所需要的各种信息。
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
我们首先就以薛之谦为例
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
通过上图,我们可以知道我们所需要的爬取内容的网址:
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
我们可以多尝试几次,然后就会发现每个分类代表其中一个id
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

规律来了,那么我们是不是就可以使用xpath进行解析提取了呢? 我们可以先试验一下:
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
我们发现这个页面是不能直接使用xpath进行解析得,xpath只能解析html标签。因为该网页携带有iframe标签,内容有不规则内容。
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
既然出现问题了,那么我们首先要想的就是要解决xpath不能进行解析这一问题。

通过验证我们发现,虽然在页面插件中不能访问,但是我们发现向另一个url发送请求依然可以获取数据,且里面没有iframe,可以直接使用xpath。

测试代码如下:

import requests
from lxml import etree

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',
}
base_url = "https://music.163.com/discover/artist/cat?id=1001"

response = requests.get(url=base_url, headers=headers)
html = response.content.decode("utf-8")
print(html) 

我们通过查找iframe,发现里面没有包含iframe,这里就可以直接使用xpath进行解析了
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
查找华语男歌手
爬虫入门经典(十) | 一文带你快速爬取网易云音乐
先把华语男歌手这一部分复制出来

<li><a href="/discover/artist/cat?id=1001"
class="cat-flag z-slt"
data-cat="1001">华语男歌手</a>
</li> 

我们先来尝试使用xpath进行解析

# 只有华语男歌手
ret = etree_obj.xpath('//a[@class="cat-flag z-slt"]/text()')
print(ret) 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
🆗,我们发现,可以获取到华语男歌手,那么我们尝试获取所有歌手的分类

# 所有歌手
ret = etree_obj.xpath('//a[@class="cat-flag"]/text()')
print(ret) 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
获取了分类之后,我们就可以获取到每个类所对应的链接

# 链接
ret = etree_obj.xpath('//a[@class="cat-flag"]/@href')
print(ret) 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
下面就开始看看拼接的URL能否正常打开

"""
华语男歌手: https://music.163.com/discover/artist/cat?id=1001
华语女歌手: https://music.163.com/discover/artist/cat?id=1002
""" 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
🆗,我们发现正是我们想要爬取内容的URL,至于前两个推荐歌手以及入住歌手为什么不爬取,是因为推荐的这些歌手都在我们要爬取的分类之中,如果全部爬取,会出现重复现象。
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

二、局部代码实现

2.1 获取所有的歌手类型

def get_type_url():
    """获取所有的歌手类型"""
    types = []

    html = parse_url(start_url)
    etree_obj =parse_html(html)
    type_name_list = etree_obj.xpath('//a[@class="cat-flag"]/text()')
    # print(type_name_list)
    type_url_list = etree_obj.xpath('//a[@class="cat-flag"]/@href')
    data_zip = zip(type_name_list[1:],type_url_list[1:])

    for data in data_zip:
        type = {}
        type["name"] = data[0]
        type["url"] = data[1]
        types.append(type)

    return types 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐

2.2 爬歌手数据

    1. 分析
      爬虫入门经典(十) | 一文带你快速爬取网易云音乐
      把此部分的源码拿出来
<a href=" /artist?id=5781" class="nm nm-icn f-thide s-fc0" title="薛之谦的音乐">薛之谦</a>
<a class="f-tdn" href="/user/home?id=97137413" title="薛之谦的个人主页"><i class="u-icn u-icn-5"></i></a> 
    1. 代码
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')

    data_zip = zip(artist_name_list, artist_url_list)
    for data in data_zip:
        item["name"] = data[0]
        item["url"] = base_url + data[1][1:]
        items.append(item) 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
我们通过观察,发现歌手正好是100个,说明我们已经成功拿到数据了。
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

2.3 发现问题

  • 1.分析

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
经过上述过程,我们已经把数据拿全了。但是我们经过查看,发现我们拿的数据并不准确,我们发现我们拿的数据应该是从A到Z才对。

并且通过点击,我们也是发现有规律的,规律如下

https://music.163.com/#/discover/artist/cat?id=1001&initial=65
https://music.163.com/#/discover/artist/cat?id=1001&initial=66
https://music.163.com/#/discover/artist/cat?id=1001&initial=90 

通过上述的规律,我们发现还要在我们已经获取的URL的基础上再加上&initial=(65,90)才行

    1. 实现
def start():
    """开始爬虫"""
    types = get_type_url()
    # print(types)
    for type in types:
        # url = base_url+type["url"]
        # url还不够完整
        # print(url)
        for i in range(65,91):
            url = "{}{}&initial={}".format(base_url,type["url"],i)
            print(url)
            get_data(url, type["name"]) 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

三、完整代码

# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-08 8:27
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 作业:网易云音乐.py
  @Version:1.0

'''
"""
华语男歌手: https://music.163.com/discover/artist/cat?id=1001
华语女歌手: https://music.163.com/discover/artist/cat?id=1002
"""
import requests
import random
import csv
import time
from lxml import etree

# num = [1001,1002,1003,2001,2002,2003,6001,6002,6003,7001,7002,7003,4001,4002,4003]
base_url = "https://music.163.com/"
# start_url = "https://music.163.com/discover/artist/cat?id=1001"
start_url = "https://music.163.com/discover/artist/"
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',
}

items = []

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 = []

    html = parse_url(start_url)
    etree_obj =parse_html(html)
    type_name_list = etree_obj.xpath('//a[@class="cat-flag"]/text()')
    # print(type_name_list)
    type_url_list = etree_obj.xpath('//a[@class="cat-flag"]/@href')
    data_zip = zip(type_name_list[1:],type_url_list[1:])

    for data in data_zip:
        type = {}
        type["name"] = data[0]
        type["url"] = data[1]
        types.append(type)

    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')

    data_zip = zip(artist_name_list, artist_url_list)
    for data in data_zip:
        item["name"] = data[0]
        item["url"] = base_url + data[1][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()
    # print(types)
    for type in types:
        # url = base_url+type["url"]
        # url还不够完整
        # print(url)
        for i in range(65,91):
            url = "{}{}&initial={}".format(base_url,type["url"],i)
            print(url)
            get_data(url, type["name"])
    save()
            # exit()

if __name__ == '__main__':
    start()

"""测试代码"""
# start_url = "https://music.163.com/discover/artist/cat?id=1001&initial=65"   a _ z
# response = requests.get(url=base_url,headers=headers)
# # print(response.content.decode("utf-8"))
# html = response.content.decode("utf-8")
# print(html)
# etree_obj = etree.HTML(html)
# # 只有华语男歌手
# # ret = etree_obj.xpath('//a[@class="cat-flag z-slt"]/text()')
# # 所有歌手
# ret = etree_obj.xpath('//a[@class="cat-flag"]/text()')
# print(ret)
# print(len(ret))
#
# # 链接
# ret = etree_obj.xpath('//a[@class="cat-flag"]/@href')
# print(ret)

"""
<li><a href="/discover/artist/cat?id=1001"
class="cat-flag z-slt"
data-cat="1001">华语男歌手</a>
</li>

https://music.163.com/discover/artist/cat?id=1001&initial=65
""" 

爬虫入门经典(十) | 一文带你快速爬取网易云音乐

四、运行结果

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


爬虫入门经典(十) | 一文带你快速爬取网易云音乐

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
爬虫入门经典(十) | 一文带你快速爬取网易云音乐

本文转自 https://buwenbuhuo.blog.csdn.net/article/details/109283572,如有侵权,请联系删除。

收藏
评论区

相关推荐

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十四) | 使用selenium尝试爬取豆瓣图书
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十五) | 邪恶想法之爬取百度妹子图
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十七) | 图形验证码识别
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(二十四) | 爬取当当网图书信息并进行数据清洗
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
被“词云”包围的冰冰会更好看吗?安排
(https://imghelloworld.osscnbeijing.aliyuncs.com/b299933deefc692934e8cc6141ab3894.png) 大家好,我是小五🐶 昨天「凹凸数据」发了一篇张同学投稿的文章《用Python爬取王冰冰vlog弹幕并制作词云(https://mp.weixin.qq.com/
用Python爬取王冰冰vlog弹幕并制作词云
(https://imghelloworld.osscnbeijing.aliyuncs.com/ee5c5cff038a2528350dc352e599b4c4.png) 大家好,我是张同学,最近的“瓜”,多到我们措手不及,可谓是“热点不断”。作为程序员,我们还可能随时为此而加班。 各种评论视频“爆炸”网络,打开首页全是热点话题的内容,某
1年前的小五都用 Python 来做什么?
↑ 点击上方 “凹凸数据” 关注 + 星标  每天更新,干货不断   (多图预警) 注:这是小五一年前在知乎的回答,当时还只有凹凸数读一个公众号,所以很多图片都会带有数读或者知乎的水印。 作为一个菜鸟数据分析师,只会sql+python业余时间写写文章:用python爬取数据→数据清洗→数据分析→数据可视化词云镇楼20190730回来看,前面
爬取五大平台621款手机,告诉你双十一在哪买最便宜!
↑关注+置顶 有趣的不像个技术号 今晚0点,相约剁手大家好,我是朱小五 明天就是双十一了,看了看自己手里的卡的像IE浏览器的手机,感觉可能等不到5G普及了。 我!要!换!手!机! 去哪买呢? 作为一个机(pin)智(qiong)boy,肯定要比价啊,哪家便宜去哪家 我用Python爬取了某比价网站的手机数据,获取了其中五大平台(天猫,京东,
Python网络爬虫与信息提取
title: Python网络爬虫与信息提取date: 20201210 01:00:23tags: Pythoncategories: 学习笔记 写在前面 不知道写啥其实说实话[TOC] 网络爬虫之规则 安装requests库cmd 命令行打开输入pip3 install requests,等待即可简单测试,爬一下bkjwpythonimport requ
《Python3网络爬虫开发实战》
提取码:1028内容简介 · · · · · ·本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、S
爬取3万景点,分析十一哪里人从众从人?
作为一名普通上班族,每个星期都在无休止的上班(没准还加班)之中度过。几个月前一直心心念念的可就是这十一的“小长假”(还调班两天)。 朱小五这次爬取分析携程国内150个热点城市的景点数据,简单的分析一下哪些景点比较受欢迎。用来预计分析一下这个十一哪里最可能人从众从人? 让我们来分析一下。 获取数据 首先,我们来明确一下我们想要爬取的数据是哪些,这里
创建免费ip代理池
&ensp;&ensp;&ensp;&ensp; 反爬技术越来越成熟,为了爬取目标数据,必须对爬虫的请求进行伪装,骗过目标系统,目标系统通过判断请求的访问频次或请求参数将疑似爬虫的ip进行封禁,要求进行安全验证,通过python的第三方库faker可以随机生成header伪装请求头,并且减缓爬虫的爬取速度,能很好的避过多数目标系统的反扒机制,但对一些安全等级
3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!
1\. 为"你"而写 这篇文章,是专门为那些 "刚学习" Python爬虫的朋友,而专门准备的文章。希望你看过这篇文章后,能够清晰的知道整个 "爬虫流程"。从而能够 "独立自主" 的去完成,某个简单网站的数据爬取。好了,咱们就开始整个 “爬虫教学” 之旅吧!2\. 页面分析 ① 你要爬取的网站是什么?首先,我们应该清楚你要爬去的网站是什么?由于这里我们想要
实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!
大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤。本文将分为以下两个部分进行讲解 在虎扑NBA官网球员页面中进行爬虫,获取球员数据。 清洗整理爬取的球员数据,对其进行可视化。