- 本demo是为了提高对Java爬虫框架webmagic的使用熟悉度。
- 本文是为了记录一些关于本demo的重要的点。
- 启示:代码中一点不起眼的小瑕疵,在硬件条件一般&&程序的高速运转中,可能被无限放大,最后导致程序崩溃。
S1:分析
- 作者分析了QQ音乐,百度音乐盒,网易云音乐,酷狗音乐,酷我音乐等音乐网站的api,发现酷我音乐爬取难度最低,所以准备爬取酷我音乐网。
QQ音乐
歌手列表:https://y.qq.com/portal/singer_list.html
歌手首页:https://y.qq.com/n/yqq/singer/002J4UUk29y8BY.html#
歌曲列表:
https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg
酷我:
歌手列表:
http://www.kuwo.cn/artist/indexAjax?category=0&prefix=&pn=0
歌手首页:
http://www.kuwo.cn/artist/content?name=xx
歌曲列表:
http://www.kuwo.cn/artist/contentMusicsAjax?artistId=226572&pn=1&rn=15
歌曲详情:
http://www.kuwo.cn/yinyue/7149583
- 注意的点:
- 歌手列表从“热门”中查询,因为这样可以避免再去按照ABCDEFG…查询
- 歌手列表中category = 0代表从“热门”这个category中查询,pn是页数(从0开始)
- 所以歌手列表完全可以转化成http://www.kuwo.cn/artist/indexAjax?pn=页数
S2:编码
编码分析:
如果是歌手列表页面
- 价值数据:歌手的首页URL,其他的歌曲列表页面
编码说明:
// 歌曲列表 private String SONG_LIST_VIEW = DOMAIN + "/artist/contentMusicsAjax\\?artistId=\\d+&pn=\\d*&rn=\\d*";
需要把本页所有(12个)歌手的首页URL存入URL待抓取队列中。
page.addTargetRequests(page.getHtml().links().regex(SINGER_INDEX_VIEW).all());
另外,还需要做一件事情,那就是在什么时候把剩余的歌手列表页面加入到URL待抓取队列中,这一点我觉得我写的不好,我是在程序处理完第一个页面接着就把剩余的六千多个页面加到内存中去的。不好的原因:过多的List还有后期的List太多导致堆内存溢出,进而导致程序崩溃,我的解决方案仅仅是设置JVM启动参数