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

注:

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

Demo导入功能助力新手快速入门

很多新手程序员们在初次接触神箭手的时候,会有种无从下手的感觉。文档太长不太愿意去看。现在神箭手提供了一个更加快捷的方案,即直接入Demo。

神箭手后台首页提供了十几个Demo程序,分别对应了不同场景下的爬虫和API代码,点击导入,即可直接使用这些爬虫,也可以通过源码学习神箭手爬虫到底如何写。

数据源管理上线

神箭手正式推出数据源管理服务,允许通过三种方式对接数据源,包括上传文件,对接数据库和爬虫内部数据。

1.数据源将开放可动态获取数据的GraphQL开发数据源托管的服务;

2.数据源允许嵌套任务,可实现数据源的清洗和处理

3.通过对接TensorFlow实现数据源的直接训练。

神箭手重磅打造云端TensorFlow,一起进入人工智能时代

TensorFlow刚刚推出了1.0版本,昭示着人工智能大潮的正式来临,各位神箭手们肯定已经蠢蠢欲动,手上拿着数据想做点什么吧?

今天,神箭手正式推出了云端TensorFlow,作为全球唯一一个可以云端开发TensorFlow的平台,咱们看看到底可以做点什么?

1.在线编码,一键运行

神箭手在线编码,一键运行的功能从爬虫延续到API,目前正式拓展到了机器学习领域,无需环境搭建,迅速开始机器学习应用之旅。

2.自动模型管理,服务

训练完成之后自动进行模型管理和自动生成服务API,只需编写核心训练代码。

3.自动对接聊天机器人

训练完成之后,自动对接微信,微博等聊天机器人应用。

4.爬虫数据打通

没有数据怎么办,直接使用神箭手爬虫去爬吧。

神箭手上线企业私密代理IP,每日15万+代理

鉴于近期爬虫经常被屏蔽,而普通的代理IP由于质量和稳定性问题无法很好的满足爬取需求,神箭手上线了企业私密代理IP,每天提供15万~20万全国各地的高匿名Https的代理IP。

购买方式

为了给大家提供足够数量的代理IP,神箭手一共架设了200台代理服务,每个月的运营成本极高。因此企业级私密代理需要购买单独服务或购买企业级套餐方可使用,由于企业私密代理IP的价格远远低于市场中私密IP的销售价格,因此企业私密IP仅可在神箭手平台上使用。会员不得通过任何方式进行转卖。

接入方式

编写好爬虫之后,直接在后台爬虫设置中勾选接入企业私密代理IP即可。神箭手默认通过HTTP的403返回码来切换代理IP。若希望自行设定切换时机,可通过实现isAntiSpider回调函数。市场中购买的爬虫均已设置好了,无需做任何额外操作。