网易云音乐爬取

前提:

scrapy这个框架很多人用过,网上教程也很多,但大多就是爬爬小说这种比较简单且有规律的,网易云音乐也有很多人写过,也有API,不过大多是爬取了热门歌曲,或是从歌单下手,但是考虑到歌单会有很多重复的。当然,从歌手页的话,如果有多个歌手合唱,那每个歌手页也都会有这首歌,但他们的链接是一样的,也是会有重复的,但是相对来说就比较少,所以就从歌手下手。

在GitHub上也有很多优秀的例子,但没有文档,我这里写一个整站的。 
项目GitHub地址:https://github.com/sujiujiu/WYYScrapy

另外,在写的过程中,发现scrapy这个框架其实不是那么完美,它对上手的要求有点高,而且又有些束缚,尤其是对数据库的操作,不是那么的完美。

就比如我要设置一些已经存在的url跳过(在没有索引的情况下),而scrapy它本身就是一个各个功能分开写的,pinelines这个文件是处理数据库的,但我要处理存在的url跳过,pinelines就不方便了,还有些可能就要写到程序,这就相悖了。所以我后来还是没有用框架又写了一遍。这一块就拿出来当教程吧。

开发环境:WIN7+Anaconda+py2.7+scrapy 
数据库:MongoDB 
文章的顺序:先分析思路,再分析scrapy框架每个模块的作用,最后写代码和分析API,只有5篇。

一、我们先爬歌手,有两种方法:

方法一:

一种是遍历,大概十一二万的样子,大多id是相隔不远的,有个别歌手有主页,但是没有申请音乐人,用这种方式比较齐,也不用去单独写代码。 
但我最开始用的是下面这种,我们也拿这个来分析:

方法二:

1、从这个页面,爬取所有歌手的id:http://music.163.com/#/discover/artist,这里要说一下,网易云的所有网址,要去掉中间那个#号才是真正的url,带#的查看源代码是获取不到真正的信息的。所以其实是:http://music.163.com/discover/artist。 
我们看这个页面左侧栏: 
image.png

2、因为当时我写的时候,参考到这篇,https://github.com/runningRobin/music163/blob/master/music163/spiders/spider.py 
左栏里的id 
这个group_ids里的就是左侧每个项对应所有的页面了(不包括最上方的推荐歌手和入驻歌手,因为包含在其他里面了)

3、我们按F12或右键检查,如图,每个对应的url是:http://music.163.com/discover/artist/cat?id=xxx: 
image.png

4、然后我们再点进去: 
image.png
url的id就是上面这个id了,而后面的initial是什么呢?initial是首字母的意思,你看下面我们选中的是A,然后它是65,是不是想到ASCII码,在ASCII码中A就是从65开始的,Z是90,后面以此类推,最后有个其他,是0,我们将它弄成一个列表:

#  男女、国家分类id
group_ids = (1001, 1002, 1003, 2001, 2002, 2003, 6001, 6002, 6003, 7001, 7002, 7003, 4001, 4002, 4003)
# 歌手姓名首字母id
initials = [i for i in range(65,91)] + [0]
  • 1
  • 2
  • 3
  • 4

二、歌手页

1、点进来之后我们来到歌手页,http://music.163.com/#/artist?id=6452,同样,去掉#, 
2、我们会发现下面有好几个块, 
image.png 
我们获取的这个url对应的是热门50首,如果你只需要热门歌曲你可以获取它所有链接: 
image.png
这个代码被我分为两块,第一块是热门50首的url,也只有url。 
而第二块textarea里是json,是这些歌曲的完整的信息,我获取的是json信息,只不过,这些信息通过lxml.etree或者BeautifulSoup用text的方式获取下来会是字符串,我们需要用json将它格式化,但是极个别在爬取的过程中,死活获取不到。 
3、上面那个是歌手的热门歌曲,我们要获取全站,就得从歌手的专辑下手,获取专辑里所有的歌手才行。因为scrapy本身的束缚,其实说是全站,并不是那么方便,比如这四个板块,我们只能选一个,一直往下,单曲或MV就得另写。 
4、我们在专辑页会发现,有些是有很多页的,后来搜的时候发现了API,所以接下来的东西,我们就不通过页面的方式了,API我是通过这个网站发现的:http://moonlib.com/606.html,因为最开始我的目的是爬评论,来看到评论的API很多变了,我以为这些都变了,一开始还搁置了没用,傻傻的去写lxml,但是它的翻页的序号是爬不到的,后来随手测试了一下API,发现都有用。我们用到的是2到6(不包括5,没用到歌单),第7条接口是MV的,不过不幸没有发现像专辑一样的列表页信息,它只有单曲的MV的API。不过这里我们用不上。后面会专门分析API。 
image.png

5、接下来就是每个专辑的所有歌曲还有专辑、歌手的一些信息,专辑下也有评论 
image.png

6、最后就是歌曲页了 
image.png

好,思路就是这样,接下来我们分析Scrapy这个框架。

posted @ 2018-04-12 20:52  崔恒跃  阅读(4597)  评论(0编辑  收藏  举报