nodejs抓取动态网页(curl.jsHelloWorld.head:saveimage下载的图片文件都是空)

优采云 发布时间: 2021-12-23 09:39

  nodejs抓取动态网页(curl.jsHelloWorld.head:saveimage下载的图片文件都是空)

  还是参考这个文章:

  另外,我在上面文章 nodejs抢网易公共类有一些经验。

  代码如下。注意http用于获取网页结果,request用于http请求,cheerio用于解析,mkdirp用于创建目录,fs用于创建文件,iconv-lite用于格式转换(这个例子不是必须的)。

  curl.js:

  /**

* Created by baidu on 16/10/17.

*/

var http = require("http");

function download(url, callback) {

var chunks = [];

http.get(url, function(res) {

res.on('data', function(chunk) {

chunks.push(chunk);

});

res.on('end', function () {

callback(chunks);

});

}).on('error', function () {

callback(chunks);

})

}

exports.download = download;

  保存图片.js

  /**

* Created by baidu on 16/10/17.

*/

var fs = require('fs');

var request = require('request');

var saveImage = function(url, filename) {

console.log('Image=>' + url);

request(url).pipe(fs.createWriteStream(filename));

console.log('Save=>' + filename);

}

exports.saveImage = saveImage;

  HelloWorld.js

  /**

* Created by baidu on 16/10/17.

*/

console.log("Hello World");

var cheerio = require('cheerio');

var curl = require('./curl');

var iconv = require('iconv-lite');

var mkdirp = require('mkdirp');

var saveimage = require('./saveimage');

//var url = 'http://open.163.com/special/opencourse/englishs1.html';

var url = 'http://loftermeirenzhi.lofter.com/tag/%E4%BA%BA%E5%83%8F?page=';

var dir = './images';

mkdirp(dir, function(err) {

if (err) {

console.log(err);

}

});

curl.download(url, function (chunks) {

if (chunks) {

var data = iconv.decode(Buffer.concat(chunks), 'gbk');

var $ = cheerio.load(data);

$('a.img').each(function (i, e) {

var item = $(e).children('img').last().attr('src');

saveimage.saveImage(item, dir + '/' + item.substr(item.indexOf('.jpg')-10, 14));

});

console.log('done');

}

else {

console.log('error');

}

});

  运行后发现下载的镜像文件基本都是空的。

  查看示例后,对saveimage.js的请求部分做了如下修改:

  /**

* Created by baidu on 16/10/17.

*/

var fs = require('fs');

var request = require('request');

var saveImage = function(url, filename) {

console.log('Image=>' + url);

request.head(url, function(err, res, body) {

request(url).pipe(fs.createWriteStream(filename));

});

console.log('Save=>' + filename);

}

exports.saveImage = saveImage;

  然后运行,成功,打印:

  /usr/local/bin/node /Users/baidu/Documents/Data/Work/Code/Self/nodejs/helloworld/HelloWorld.js

Hello World

Image=>http://imgsize.ph.126.net/?imgurl=http://img2.ph.126.net/CiL5IULFm0TtZBjxnhcfQQ==/52072870709354180.jpg_110x110x0x90.jpg

Save=>./images/0709354180.jpg

Image=>http://imglf1.nosdn.127.net/img/SzZqcDg4Rk01VGo5cW81TEorTU5zL2dCbjBLbktBODlCSkFGSXlIdEw5dEFvSDlGaTNjZmJ3PT0.jpg?imageView&thumbnail=500x0&quality=96&stripmeta=0&type=jpg

Save=>./images/TNjZmJ3PT0.jpg

......

done

  然后在项目目录下生成images目录,里面有美女的图片:

  

  目前还不是特别清楚上述变化是否会产生影响。(head一般用来判断url是否有效。)

  头部添加成功。也可能是因为虽然第一次下载图片没有成功,但是已经开始下载并缓存了。试验了一下,成功后,去掉head命令:

  //request.head(url, function(err, res, body) {

request(url).pipe(fs.createWriteStream(filename));

//});

  发现仍然可以成功。所以很可能是图片加载延迟造成的。

  有空看看怎么避免图片下载超时导致下载失败的问题,有没有设置超时的地方。

  好像在请求初始化的时候,可以设置:

  request({

url: jurl,

gzip: true,

timeout: xxx

})

  后面我们会学习Javascript Request和一些渲染的内容。特别是 phantomjs 呈现动态网页的方式。

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线