CNode

hi,node.js 抓取网页数据经常不行?

问答
Jjiangwest发布于11 年前最后回复11 年前20 回复9041 浏览0 收藏

奇怪!


  var http =  require('http');
  var cheerio = require("cheerio");
  var fs = require('fs');
  
  var url = "...";	//网页地址  
  
  http.get(url, function(res) {
	  var pageData = "";
	  //get 请求
	  res.on('data', function(data) {
		  pageData += data;
	  });
	  //获取到数据 source,我们可以对数据进行操作了!
	  res.on('end', function() {
		  //网页源码        
		  console.log(pageData);
		  var $ = cheerio.load(pageData);
  			//用cheerio解析网页数据
		  $('meta').each(function(i, e) {
			  //'\r\n' -- 回车换行
			  fs.appendFile('message1.txt', $(e).attr('content') + '\r\n', function (err) {
				  if (err) throw err;  
				  
				  console.log('It\'s saved!');
			  });
		  });
		  
	  });
  }).on('error', function() {
	  console.log("Error!");
  });

3Q

查看回复

回复 (20)

J
jiangwest#1·11 年前

我在代码中加入


	console.log( 'statusCode:' + res.statusCode);

Response.StatusCode状态代码返回为: statusCode: 302 ,似乎表示URL地址为临时地址? HTTP Status Codes 302:Redirection。(客户端浏览器必须采取更多操作来实现请求。) 我估计要考虑 重定向 问题,先试试! 而可以成功抓取网页时,statusCode: 200。 有何高招?

M
magicdawn#2·11 年前

用 superagent 会自动考虑 redirect , gzip/deflate压缩 各种问题...

H
hcnode#3·11 年前

node爬网页,用jsdom,非常爽,封装请求和返回,并可以直接操作dom,甚至可以使用jquery的选择器直接爬想要的数据!


var jsdom = require("jsdom");
var fs = require("fs");
var jquery = fs.readFileSync(__dirname + "/bower_components/jquery/dist/jquery.min.js", "utf-8");
jsdom.env({
			url: "http://xxx/xx.html",
			src: [jquery],
			done: function (errors, window) {
				if(!window){
					return;
				}
				var $ = window.$;
				if(!$){
					return;
				}
				var someText = $(".someClass someTab").html();
				......
'''				
L
luoyjx#5·11 年前
引用 alsotang@hcnode 用 cheerio 更爽

是的,cheerio还挺方便,我前些天写了个简单的东西爬掉segmentfault的所有标签及描述哈哈 代码略烂,不过目的达到了 simple-tag-spider

Y
yakczh#6·11 年前

已经抓取的页面,更新了抓取怎么判断?

E
erwenzhang#7·11 年前

关注各类爬虫问题~同问

T
TossShinHwa#8·11 年前

你需要完整的 Agent. 直接用 http 太 low...

L
leapon#9·11 年前

没有抓到数据就退出 - 返回码是什么?

L
luoyjx#10·11 年前

我最近碰到400问题是中文要encode下 自豪地采用 CNodeJS ionic

C
CarlosRen#11·11 年前

好好研究研究吧 我这每天定时取数据都没问题的

J
jiangwest#12·11 年前

我采用 superagent module, 可以抓取acm dl网页,原来问题应该是acm dl网页重定向所导致, 我改写 使用 superagent 与 cheerio 完成简单爬虫,可行。但目前我的程序仍有不少问题,待完善。

Z
zxc122333#13·11 年前

网站防抓,ban掉你了 或者是异常访问量太大,被防火墙拦截了

W
wuxiaoqian88#14·11 年前

抓页面数据 建议用request

J
jiangwest#15·11 年前

我现在考虑 是否可将 express.js 与 jQuery UI相结合,做后端GUI? 不知可行?试一试

L
luoyjx#16·11 年前
引用 wuxiaoqian88抓页面数据 建议用request

@wuxiaoqian88 开始用的request后来换superagent感觉一般使用的话都还好,当时没意识到是控制并发的问题 自豪地采用 CNodeJS ionic

J
Jarvin-Guan#17·11 年前

直接用SuperAgent吧

S
songqinghehe#18·11 年前

我曾经用superagent来抓取xml流,可惜抓不到,后来换了request才能抓取到,这是何解?

W
wuxiaoqian88#19·11 年前

@luoyjx 抓取页面的东西最好支持gzip这些, 不然下载太慢了; 并发控制, 可用async来弄, 页面解析一般用cheerio

参与回复
登录后即可参与回复。登录