利用Node.js制作爬取大众点评的爬虫

2020-06-17 07:34:48易采站长站整理

前言

Node.js天生支持并发,但是对于习惯了顺序编程的人,一开始会对Node.js不适应,比如,变量作用域是函数块式的(与C、Java不一样);for循环体({})内引用i的值实际上是循环结束之后的值,因而引起各种undefined的问题;嵌套函数时,内层函数的变量并不能及时传导到外层(因为是异步)等等。

一、 API分析

大众点评开放了查询餐馆信息的API,这里给出了城市与

cityid
之间的对应关系,

链接:http://m.api.dianping.com/searchshop.json?&regionid=0&start=0&categoryid=10&sortid=0&cityid=110

GET
方式给出了餐馆的信息(JSON格式)。

首先解释下GET参数的含义:

     1、

start
为步进数,表示分步获取信息的index,与
nextStartIndex
字段相对应;

     2、

cityid
表示城市id,比如,合肥对应于110;

     3、

regionid
表示区域id,每一个id代表含义在
start=0
rangeNavs
字段中有解释;

     4、

categoryid
表示搜索商家的分类id,比如,美食对应的id为10,具体每一个id的含义参见在
start=0
categoryNavs
字段;

     5、

sortid
表示商家结果的排序方式,比如,0对应智能排序,2对应评价最好,具体每一个id的含义参见在start=0时sortNavs字段。

在GET返回的JSON串中list字段为商家列表,id表示商家的id,作为商家的唯一标识。在返回的

JSON
串中是没有商家的口味、环境、服务的评分信息以及经纬度的;

      因而我们还需要爬取两个商家页面:http://m.dianping.com/shop/<id>、http://m.dianping.com/shop/<id>/map。

通过以上分析,确定爬取策略如下(与dianping_crawler的思路相类似):

      1、逐步爬取searchshop API的取商家基本信息列表;

      2、通过爬取的所有商家的id,异步并发爬取评分信息、经纬度;

      3、最后将三份数据通过id做聚合,输出成json文件。

二、爬虫实现

Node.js爬虫代码用到如下的第三方模块: