您的位置:首页 > Web前端 > JavaScript

如何在神箭手上快速开发爬虫——第二课 如何爬取JS动态生成的数据【豌豆荚游戏排行榜】

2017-04-26 13:49 567 查看
注:

1、本课完整的爬虫代码可以在神箭手示例代码中查看:http://www.shenjianshou.cn/index.php?r=demo/docs&demo_id=500003

2、如何在神箭手上运行代码,请查看文档:http://docs.shenjianshou.cn/overview/guide/develop/crawler.html

3、更详细的爬虫开发教程,请查看文档:http://docs.shenjianshou.cn/develop/summary/summary.html

大家好,游牧老师我又来啦( ̄▽ ̄)”

想必大家都看过我这个系列的第一篇教程:简单的文章爬虫【糗事百科】了吧,如果还没有看过的小伙伴建议先去看一下,有点基础再继续看此课,更容易理解哦~

好了,我们开始如何在神箭手上开发爬虫系列的第二课,今天我们主要来研究下如何爬取JS动态生成的数据。

熟悉网页的童鞋都知道,现在很多网页都是动态的,也就是说很多数据都是通过js异步加载显示的。在神箭手上开发爬虫,有两种方式可以方便爬取这类动态生成的数据:1、模拟发送http请求;2、使用神箭手提供的自动js渲染大杀器。

简单说明一下这两种方式的区别吧:

1、模拟发送http请求。

需要分析下http请求的地址、参数等,一般用chrome的开发者工具的Network选项就能很容易地看到。

这种方式很灵活,获取数据的速度很快。不过需要一定的请求分析能力,另外如果js很多,逐个模拟发请求也挺麻烦的。

2、使用神箭手提供的自动js渲染。

只需要在configs中设置enableJS:true就可以开启自动js渲染,就可以像爬取静态页面的数据一样直接抽取动态数据即可。

这种大杀器用起来不要太爽哦,不过因为渲染需要一段时间,所以获取数据的速度肯定没有模拟发送请求快。另外如果在渲染的过程中切换代理ip可能会导致渲染失败。

p.s. 更多关于js自动渲染的介绍请参考神箭手开发文档:http://docs.shenjianshou.cn/develop/extensions/renderJS.html

本课咱们主要来看下第一种方式:模拟发送http请求

以爬取豌豆荚的游戏排行榜上的游戏信息为例,首先老规矩,先来瞻仰下这个页面(http://www.wandoujia.com/top/game):



第一步,跟我一起喊:入口页、列表页、内容页

没错,爬虫开发第一步,先来确定咱们爬虫这三大件的url(懵懵懂懂的小伙伴先去看下这个系列教程的第一课)

入口页:http://www.wandoujia.com/top/game

内容页:类似这样的url:http://www.wandoujia.com/apps/com.gameloft.android.ANMP.GloftA8CN.wdj

列表页:

列表页是经典的“加载更多”显示下一页,咱们再看下入口页的网页源代码,里面没有下一页列表页的链接,也就是说无法通过爬虫的自动链接发现获取列表页了。

这种情况就是咱们刚说的js动态网页了,也就是说咱们要爬取的链接或者数据不在网页源码中。

那么通过简单的分析就可以发现,下一页链接是这样的http请求:



所以咱们可以通过神箭手提供的addUrl函数将该类url手动添加到待爬队列中,就可以实现模拟发送该请求返回数据啦~

这部分处理的代码如下,在回调函数中实现:

/*
回调函数onProcessHelperPage:获取下一页列表页以及从列表页中获取内容页链接,并手动添加到待爬队列中
*/
configs.onProcessHelperPage = function(page, content, site) {
// 列表页返回的数据是json,需要先转换成json格式
var jarr = JSON.parse(content);
// 从json数组中获取内容页链接并添加到待爬队列中
for (var i = 0, n = jarr.length; i < n; i++) {
var new_url = "http://www.wandoujia.com/apps/"+jarr[i].packageName;
site.addUrl(new_url);
}
// 获取下一页列表页链接并添加到待爬队列中
var currentStart = parseInt(page.url.substring(page.url.indexOf("&start=") + 7));
var start = currentStart+12;
if(start < 100){ // 该demo只爬取游戏排行榜前100的游戏
site.addUrl("http://apps.wandoujia.com/api/v1/apps?type=weeklytopgame&max=12&start="+start);
}
return false; // 返回false表示不从当前列表页中自动发现新的链接,从而避免添加无用的链接,提高爬取速度
};


第二步,从内容页中抽取想要的数据

这里我们抽取的数据包括:游戏名称、下载量、图标,还是用xpath来抽取

具体实现代码如下:

fields: [
{
name: "game_name",
alias: "游戏名",
selector: "//span[contains(@class,'title')]",
required: true
},
{
name: "game_download",
alias: "下载量",
selector: "//i[@itemprop='interactionCount']"
},
{
name:"game_icon",
alias: "游戏图标",
selector:"//div[contains(@class,'app-icon')]/img[@itemprop='image']/@src"
}
]


第三步,运行爬虫,拿到数据

到这里,这个爬虫就写完啦,是不是很简单(都说了用神箭手开发爬虫是目前最简单最快捷的方式啦)

完整的代码请看这里:http://www.shenjianshou.cn/index.php?r=demo/docs&demo_id=500003

最后咱们把完整的代码复制到神箭手新建爬虫应用中,点击启动,喝杯茶数据就自动爬出来啦:



p.s. 更多爬取js动态数据的例子,请点我查看:http://docs.shenjianshou.cn/develop/advance/useAJAX.html

再p.s. 如何把爬取的数据发布到自己的系统或者导出到本地文件,看这里:http://docs.shenjianshou.cn/use/publish/summary.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息