使用sync-request和cheerio写爬虫

简介: node.js自带的http模块是异步获取网页内容的,不过我们可以到npm上去搜索同步的http模块。sync-request就是其中一种。

node.js自带的http模块是异步获取网页内容的,不过我们可以到npm上去搜索同步的http模块。sync-request就是其中一种。

首先,安装sync-request包:

npm install sync-request

它的使用方法是:

var request = require('sync-request');
var html = request(method, url, options).getBody().toString();

然后我们需要一个解析html树的工具。jsdom可以用,但是它实在是太大,我们可以用cheerio,它提供了类似jquery的api,更加便捷。

npm install cheerio

之后:

var cheerio = require('cheerio');
var $ = cheerio.load(html);

下面是抓取菜鸟教程(runoob.com)单部教程的一个例子:

var cheerio = require('cheerio');
var request = require('sync-request');
var fs = require('fs');

var ofile = fs.openSync('out.html', 'w');

var url = 'http://www.runoob.com/html/html-tutorial.html';
var html = request('GET', url).getBody().toString();

var toc = getToc(html);
for(var i in toc) {
    var url = toc[i];
    console.log('page: ' + url);
    html = request('GET', url).getBody().toString();
    var content = getContent(html);
    fs.writeSync(ofile, content, null, 'utf-8');
}

fs.closeSync(ofile);
console.log('Done..');


function getToc(html)  {

    var $ = cheerio.load(html);

    var $list = $('#leftcolumn').find('a');
    var res = [];
    for(var i = 0; i < $list.length; i++)
    {
        var url = $list.eq(i).attr('href');
        res.push('http://www.runoob.com/' + url);
    }
    return res;
}


function getContent(html) {
    var $ = cheerio.load(html);
    var content = $('#content').html();
    return content;
}
相关文章
|
1月前
|
数据采集 前端开发 JavaScript
如何在爬虫过程中正确使用Promise对象和async/await?
如何在爬虫过程中正确使用Promise对象和async/await?
20 2
|
5月前
|
JSON JavaScript 前端开发
基于promise用于浏览器和node.js的http客户端的axios
基于promise用于浏览器和node.js的http客户端的axios
37 0
|
4月前
|
数据采集 调度 Python
Scrapy爬虫中合理使用time.sleep和Request
Scrapy爬虫中合理使用time.sleep和Request
|
2月前
|
机器学习/深度学习 前端开发 JavaScript
源映射错误:Error: request failed with status 404 源 URL:http://localhost:8080/bootstrap/js/axios-0.18.0.js
源映射错误:Error: request failed with status 404 源 URL:http://localhost:8080/bootstrap/js/axios-0.18.0.js
43 0
源映射错误:Error: request failed with status 404 源 URL:http://localhost:8080/bootstrap/js/axios-0.18.0.js
|
4月前
|
前端开发 JavaScript 安全
AJAX - $().load(url,data,function(response,status,xhr))
AJAX - $().load(url,data,function(response,status,xhr))
28 0
|
9月前
|
前端开发 PHP
php解决ajax使用post请求时提交的数据过多而导致et::ERR_CONNECTION_RESET的解决方案
php解决ajax使用post请求时提交的数据过多而导致et::ERR_CONNECTION_RESET的解决方案
130 0
|
12月前
|
JavaScript 网络协议 数据安全/隐私保护
Node.js入门之url模块和querystring模块
url模块和querystring模块是非常重要的两个URL处理模块。在做node服务端的开发时会经常用到。
131 0
|
JSON API 数据格式
Node【六】内置模块 【url模块与queryString】
Node【六】内置模块 【url模块与queryString】
128 0
|
JavaScript
Node.js:axios自定义headers请求头
Node.js:axios自定义headers请求头
123 0
|
JSON 前端开发 中间件
BUG排查-koa2中koa-body和koa-bodyparser共用时POST会出现超时
周日有个小伙加我,帮他排查了一下问题。正好记录一下。 前端是:axios 后台是:koa2 问题:axios 发 post 请求不携带参数请求正常,携带参数就无响应。 因为我也不知道小伙那些说的是真的,那些是假的,那我们就一点一点排查,我大致定位问题为以下几个方向。 参数携带不正确,axios 发过去的数据是错的,比如说被 {id: 1} 却发送的 [object Object] 参数携带不正确,比如说后台只接收 appliction/json、application/x-www-form-urlencoded、multipart/form-data 其中一种 这流程没毛病吧,先找前端自
354 0
BUG排查-koa2中koa-body和koa-bodyparser共用时POST会出现超时