如何在神箭手上快速开发爬虫——第二课 如何爬取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):
![](http://img.blog.csdn.net/20170426134647146?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91bXVtemNz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第一步,跟我一起喊:入口页、列表页、内容页
没错,爬虫开发第一步,先来确定咱们爬虫这三大件的url(懵懵懂懂的小伙伴先去看下这个系列教程的第一课)
入口页:http://www.wandoujia.com/top/game
内容页:类似这样的url:http://www.wandoujia.com/apps/com.gameloft.android.ANMP.GloftA8CN.wdj
列表页:
列表页是经典的“加载更多”显示下一页,咱们再看下入口页的网页源代码,里面没有下一页列表页的链接,也就是说无法通过爬虫的自动链接发现获取列表页了。
这种情况就是咱们刚说的js动态网页了,也就是说咱们要爬取的链接或者数据不在网页源码中。
那么通过简单的分析就可以发现,下一页链接是这样的http请求:
![](http://img.blog.csdn.net/20170426134710567?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91bXVtemNz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
所以咱们可以通过神箭手提供的addUrl函数将该类url手动添加到待爬队列中,就可以实现模拟发送该请求返回数据啦~
这部分处理的代码如下,在回调函数中实现:
第二步,从内容页中抽取想要的数据
这里我们抽取的数据包括:游戏名称、下载量、图标,还是用xpath来抽取
具体实现代码如下:
第三步,运行爬虫,拿到数据
到这里,这个爬虫就写完啦,是不是很简单(都说了用神箭手开发爬虫是目前最简单最快捷的方式啦)
完整的代码请看这里:http://www.shenjianshou.cn/index.php?r=demo/docs&demo_id=500003
最后咱们把完整的代码复制到神箭手新建爬虫应用中,点击启动,喝杯茶数据就自动爬出来啦:
![](http://img.blog.csdn.net/20170426134734489?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91bXVtemNz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
p.s. 更多爬取js动态数据的例子,请点我查看:http://docs.shenjianshou.cn/develop/advance/useAJAX.html
再p.s. 如何把爬取的数据发布到自己的系统或者导出到本地文件,看这里:http://docs.shenjianshou.cn/use/publish/summary.html
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
相关文章推荐
- 如何在神箭手上快速开发爬虫——第二课 如何爬取JS动态生成的数据【豌豆荚游戏排行榜】
- 如何在神箭手上快速开发爬虫——第四课 如何爬取分页数据【蘑菇街商品评论】
- 如何在神箭手上快速开发爬虫——第三课 如何爬取列表页数据【87870 VR资讯文章】
- 如何在神箭手上快速开发爬虫——第一课 简单的文章爬虫【糗事百科】
- 如何在神箭手上快速开发爬虫——第一课 简单的文章爬虫【糗事百科】
- 如何用Cocos2d-JS快速开发一个微信游戏《来自喵星的你》
- JAVA 爬虫获取js动态生成的网页数据
- js如何获取table中动态生成的数据
- 如何抓取Js动态生成数据且以滚动页面方式分页的网页
- 如何抓取Js动态生成数据且以滚动页面方式分页的网页
- 如何快速搭建Cocos2d-JS游戏开发环境
- 如何抓取Js动态生成数据且以滚动页面方式分页的网页
- Oracle中如何用一条SQL快速生成10万条测试数据
- Java爬虫Jsoup+httpclient获取动态生成的数据
- Oracle中如何用一条SQL快速生成10万条测试数据
- 记录:ajax获取数据动态生成select下拉选js部份
- js动态生成数据列表
- 分享一个快速开发动态互动HTML5可视化图形效果的Javascript类库 - Envision.js
- 【Python爬虫5】提取JS动态网页数据
- .NET动态生成DataSet下使用DataAdapter保存数据时,如何生成command语句及使用事务(转)