/build_spider

build a spider from jikexueyuan

Primary LanguageJavaScript

build_spider

build a spider from jikexueyuan

爬虫以及Robots协议介绍

爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化。

如果数据量很大,而且你的算法又比较强大,并且可以给别人检索服务的话,那么你的爬虫就是一个小百度或者小谷歌了

http://www.csdn.net/article/2015-11-13/2826205

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

robots.txt 是一个文本文件,robots.txt 是一个协议,不是一个命令。robots.txt 是爬虫要查看的第一个文件。robots.txt 文件告诉爬虫在服务器上什么文件是可以被查看的,搜索机器人就会按照该文件中的内容来确定访问的范围。NodeJS 底层引擎是 JS,JS 天生为操作 DOM 而生,所以用 NodeJS 开发爬虫非常简单。

当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;
如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。

可以通过robots.txt来查找对应的内容:https://nba.hupu.com/robots.txt

搭建开发环境

在Node.js环境下,需要用到一下模块:

  • Express
  • Request
  • Cheerio

可以在这里找到模块的用法:https://www.npmjs.com

Express

http://www.expressjs.com.cn/

Request

https://www.npmjs.com/package/request

request模块让http请求变的更加简单,如下:

var express = require('express');
var app = express();
 
app.get('/', function(req, res){
 res.send('hello world');
});
 
app.listen(3000);

Cheerio

cherrio 是为服务器特别定制的,快速、灵活、实施的jQuery核心实现。

通过cherrio,我们就可以将抓取到的内容,像使用jquery的方式来使用了。

https://www.npmjs.com/package/cheerio

var cheerio = require('cheerio'),
$ = cheerio.load('<h2 class="title">Hello world</h2>');
$('h2.title').text('Hello there!');

安装Express

到对应的目录下,执行npm init,进行一系列信息配置

http://jingyan.baidu.com/article/1974b2898f3cadf4b1f77420.html

http://www.jianshu.com/p/3f71d1895940

或者,使用其他方法

用express直接创建一个项目。安装之后node.js和express之后,还要配置系统环境,不然express命令不能用。

http://jingyan.baidu.com/article/922554468a3466851648f419.html

http://jingyan.baidu.com/article/7f41ecec0e3a25593d095c26.html

装好之后就执行命令:express spider,创建一个基于Express的项目。

**注意:**由于我是在FAT32的磁盘格式下建立的项目,所以会报错:https://segmentfault.com/q/1010000008042797。到NTFS格式下建立即可。

安装依赖包:cnpm install

启动cnpm start.监听的是3000端口,打开localhost:3000

退出,然后安装request。回到目录spider下,执行命令: cnpm install request --save-dev

npm install --save 与 npm install --save-dev 的区别:

一个放在package.json 的dependencies , 一个放在devDependencies里面;产品模式用dependencies,开发模式用devDep。

--save-dev 是你开发时候依赖的东西,--save 是你发布之后还依赖的东西。

比如,你写 ES6 代码,如果你想编译成 ES5 发布那么 babel 就是devDependencies。如果你用了 jQuery,由于发布之后还是依赖jQuery,所以是dependencies。

接着安装cheerio,方法同上.

实战

使用app.js,将其原本的代码清空,直接使用官网给的示例:http://www.expressjs.com.cn/4x/api.html

var express = require('express');
var app = express();

app.get('/', function(req, res){
  res.send('hello world');
});

app.listen(3000);

这里要用到supervisor:所以还得先安装(并不是装在项目里,而是系统里面):http://www.cnblogs.com/pigtail/archive/2013/01/08/2851056.html

执行命令:npm -g install supervisor

然后执行:supervisor start app.js,就可以打开http://localhost:3000/了

在npm找到request:https://www.npmjs.com/package/request,示例:

var request = require('request');
request('https://www.lagou.com/', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Show the HTML for the Google homepage. 
  }
})

复制到app.js.

引入cheerio

var express = require('express');
var app = express();
var request = require('request');
var cheerio = require('cheerio');

app.get('/', function(req, res){
request('https://www.lagou.com/', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(body);   //当前的$就是一个拿到了整个body的前端开发选择器
    res.send("几大类:"+$('.mainNavs .menu_box h2').text())
  }
})});

app.listen(3000);

console.log("it is listening!")

我们抓到的内容都返回到了request的body里面。cherrio可以获取所有的dom选择器。

在使用爬虫的时候,还要使用到request的异步请求把数据给拉取过来,这样才能实现一个完整地请求。

还有就是规定每天几时爬,这也有相关的模块。

可以查找所爬网站的robots:http://www.lagou.com/robots.txt

var express = require('express');
var app = express();
var request = require('request');
var cheerio = require('cheerio');
var path = require('path');

app.get('/', function(req, res){
request('https://www.lagou.com/', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(body);   //当前的$就是一个拿到了整个body的前端开发选择器
    res.send("几大类:"+$('.mainNavs .menu_box h2').text())
  }
})});

app.listen(3000);

console.log("it is listening!")