开发环境:WIN7+Anaconda+py2.7+scrapy
数据库:MongoDB
文章的顺序:
1、先分析思路;
2、再分析scrapy框架每个模块的作用;
3、最后写代码和分析API,以及评论
Scrapy爬取网易云音乐和评论(一、思路分析)
一、我们先分析歌手,有两种方法:
方法一:遍历
优点:有个别歌手有主页,但是没有申请音乐人,所以不存在歌单列表页,用第二种方法也获取不到。
缺点:不好测试它到底有多少,大概十一二万的样子,大多id是相隔不远的。有些id之间相隔了几位数,本来挺稳定的,想着往4位数遍历就行,却发现还有7位数的,这样遍历的跨度有些大,(id从1872开始),要做些处理,还有判断这个页面存在与否。
方法二:从歌手分类爬取所有歌手的id
歌手分类页:http://music.163.com/#/discover/artist
这里要说一下,网易云的所有网址,要去掉中间那个#号才是真正的url,带#的查看源代码是获取不到真正的信息的。
所以其实是:http://music.163.com/discover/artist
优点:方便,不需要考虑遍历的数量,不需要对页面是否存在做处理
缺点:可能会漏掉一些有主页但未注册的歌手。
我们主要以方法二入手,分析如下:
我们看这个页面左侧栏:
2、因为当时我写的时候,参考到前面提到的那篇GitHub上的代码,
这个group_ids里的就是左侧每个项对应所有的页面了(不包括最上方的推荐歌手和入驻歌手,因为包含在其他里面了)
3、我们按F12或右键检查,如图,每个对应的url是:http://music.163.com/discover/artist/cat?id=xxx,
这里的id就是上面group_ids里的数字了。
4、然后我们再点进去,如图四,url的id就是上面这个group_ids里的元素了,而后面的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、点进来之后我们来到歌手页,http://music.163.com/#/artist?id=6452,同样,查看源代码的时候去掉url里的#。
2、我们获取的这个歌手页的url对应的是热门50首,在对应网页里我们会发现下面有好几个块:热门50首、专辑、MV、歌手介绍
3、因为受框架的限制,以上四个信息的内容不在一个传递链里,
以下两种顺序的特点都是后者传入的参数都是由前者返回的,而这四个之间属于相同的id,他们并不需要由前者返回,不构成一个传递链:
1)、歌手 ——>专辑列表——>歌曲列表——>歌曲信息——>第5步
2)、歌手 ——>热门50首的歌曲列表——>歌曲信息——>第4步
4、如果如果你只需要热门歌曲你可以获取它所有链接,这个代码被我分为两块:
1)、第一块是包含热门50首的url,也只有url,在id名为'song-list-pre-cache'的div标签里,div->ul->li->a->href
2)、而第二块textarea里是json,是这50首歌的比较完整的信息,只不过,这些信息通过lxml.etree或者BeautifulSoup用text的方式获取下来会是字符串,我们需要用json将它格式化。
如果你只需要歌曲的话,选择第一条就好了,直接跳到第四篇讲API的),用歌曲的API即可。
5、我们要获取所有歌手的歌曲,就得从歌手的专辑下手,获取专辑里所有的歌手才行。我们在专辑页会发现,有些是有很多页的,我最开始用的是scrapy的xpath解析页面,后来搜的时候发现了API,所以接下来的东西,我们就不通过页面的方式了,API我是通过这个网站发现的:http://moonlib.com/606.html(最近发现网站挂了,请看我的第四篇讲API的,有其他类似API的文章链接)。
我们用到的是2到6(不包括5,没用到歌单),第7条接口是MV的,不过不幸没有发现像专辑一样的列表页信息,它只有单曲的MV的API。不过这里我们用不上。后面第四篇会专门分析API。
6、接下来就是每个专辑的所有歌曲还有专辑、歌手的一些信息,另外专辑下也有评论,且评论数的获取方式有些不同,因此评论有两种处理。
7、最后从图八里的歌曲链接点进去的就是歌曲页了,如图九:
二、Scrapy框架每个模块的作用
关于如何建立一个scrapy程序,可以参考这两篇文章:
1、http://cuiqingcai.com/3472.html(创建的时候推荐)
2、http://www.cnblogs.com/wuxl360/p/5567631.html
关于使用mongodb,可以参考: