文档章节

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

数据工厂V
 数据工厂V
发布于 2017/04/25 18:00
字数 1396
阅读 26
收藏 0

注:

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

© 著作权归作者所有

数据工厂V
粉丝 9
博文 24
码字总数 25887
作品 0
杭州
私信 提问
如何在神箭手上快速开发爬虫——第八课 如何爬取手机瀑布流网页数据【手机参考网新闻】

1、本课完整的爬虫代码可以在神箭手示例代码中查看 2、如何在神箭手上运行代码,请查看文档 3、更详细的爬虫开发教程,请查看文档 大家好,我是来自神箭手的游牧老师。一段时间不见,不知道大...

神箭手云爬虫
2018/03/19
0
0
【福利】写爬虫,能赚钱:简单几行脚本就能获得100元!

为感谢各开发者对神箭手云爬虫开发平台的支持,使大家更进一步快速熟悉爬虫的开发,神箭手云爬虫现面向所有开发者公开征集爬虫,具体事宜如下所示: 一、活动对象 所有开发者 二、具体要求 ...

vivianwendy123
2016/07/09
2.3K
2
菜鸟学Python,上半年文章大汇总

一晃大半年过去了,时间过的真快啊!上半年我一共发表了原创的文章有近45篇,其中有一些是粉丝投稿的!后台总有人留言说查找历史文章不方便,怎么办?为了方便大家阅读,我把上半年的原创文章...

菜鸟学python
2018/06/24
0
0
使用scrapy的定制爬虫-第二章-概

但在堆代码之前,先预研一下,然后想想下面几个问题. 1,你定制爬虫的目标 2,预计的规模 3,是否需要js支持 4,是单次爬取还是周期性爬取 5,其他 6,突破网站的防爬取策略 如上几个问题也并非完全独...

斑ban
2013/04/03
2K
3
快速开发爬虫系统的云框架--神箭手云爬虫

神箭手云爬虫是一个帮助开发者快速开发爬虫系统的云框架。神箭手提供上手简单,灵活开放的爬虫云开发环境,让开发者只需要在线写几行js代码就可以实现一个爬虫。并且爬虫将自动运行在云服务器...

匿名
2016/05/12
7.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部