本期为怪咖系列第三期,第二期由于客户论文查重问题,暂不对外公开源码,第二期离第三期的时间有点长,近期事情较多。本期使用的语言为java,打造一个多线程,支持断点采集,URL去重,广度优先+深度结合,如何利用已经造好的轮子进行快速开发装逼。好了,吹水完毕,现在进入教程阶段。
爬虫
学会简单使用Java爬虫框架--Webcollect。
如何去尝试破解网站真实请求的地址。
采集网易云音乐(http://music.163.com)5亿首歌曲的真实地址+歌曲名字+演唱者+歌曲id。
如何优雅地装逼。
jdk1.7+、eclipse。
一些杂七杂八的jar包,文章底部有提供下载链接地址。
任意一款抓包工具。
肯实际动手操作的态度。
采集结果写入excel
WebCollector是一个无需配置、便于二次开发的JAVA爬虫框架,它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫。WebCollector-Hadoop是WebCollector的Hadoop版本,支持分布式爬取。并且在2.x的版本中提供了selenium,可以处理javascript生成的数据。我们先来看下WebCollector的内核构架图:
爬虫架构图
然而我们使用WebCollector来写爬虫不用那么麻烦,只用集成爬虫框架里的BreadthCrawler类并重写visit方法即可,我们先来看下官网的例子:
官网示例
程序说明:
visit()方法
在整个抓取过程中,只要抓到一个复合的页面,wc都会回调该方法,并传入一个包含了所有页面信息的page对象。
addSeed()
添加种子,种子链接会在爬虫启动之前加入到上面所说的抓取信息中并标记为未抓取状态.这个过程称为注入。
addRegex
为一个url正则表达式, 过滤不必抓取的链接比如.js .jpg .css等,或者指定抓取链接的规则。比如我使用时有个正则为:http://news.hexun.com/2015-01-16/[0-9]+.html, 那么我的爬虫则只会抓取http://news.hexun.com/2015-01-16/172431075.html,http://news.hexun.com/2015-01-16/172429627.html 等news.hexun.com域名下2015-01-16日期的.html结尾的链接。
start()
表示启动爬虫,传入参数5表示抓取5层(深度为5),这个深度为5怎么理解呢,当只添加了一个种子, 抓这个种子链接为第1层, 解析种子链接页面跟据正则过滤想要的链接保存至待抓取记录. 那么第2层就是抓取1层保存的记录并解析保存新记录,依次类推。
我们先来看下一个网易云音乐的歌曲页面链接:http://music.163.com/#/album?id=2884361,观察这个url,发现是一个查询台,通过查询id可以得到不同的歌曲,我们故可以遍历整个网易云音乐,把其中url与上面类似的网页提取出来就可以得到网易云音乐的所有歌曲了。
这个时候我们碰到了第二个问题,得到了歌曲的页面后我们怎么可以得到音乐的真实地址,我们通过抓包分析得到网易云音乐有一个api接口,可以得到歌曲的真实地址,api地址:http://music.163.com/api/song/detail,这个接口有几个参数:
id 传入上面得到的歌曲的id
ids ids是由id拼接而成的,ids = '%5B+' + id + '%5D'
然后访问该api既可以得到一段json,里面既有歌曲的几个版本的音频源地址。至于是怎么抓包分析到该地址的,下次教程会提供给大家。
不说这么多了,上代码,已经将所有的核心代码添加上注释了,整个爬虫的思路就是这样:
网页爬虫源码
附上Github地址:https://github.com/scienceswork/music-webcollector。欢迎关注怪客科学,学习关注有趣的小技巧。
联系客服