奇怪!
- 当url="http://www.hao123.com/"时,以下程序正常执行;
- 当url为ACM dl 网址时,同一网址抓取数据,大部分时时间pageData为空,即没有抓到数据就退出!偶然可以抓取成功。
- 问问,是何原因?有何方法?
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
关注各类爬虫问题~同问
你需要完整的 Agent. 直接用 http 太 low…
没有抓到数据就退出 - 返回码是什么?
我在代码中加入
console.log( 'statusCode:' + res.statusCode);
Response.StatusCode状态代码返回为: statusCode: 302
,似乎表示URL地址为临时地址?
HTTP Status Codes 302:Redirection。(客户端浏览器必须采取更多操作来实现请求。)
我估计要考虑 重定向 问题,先试试!
而可以成功抓取网页时,statusCode: 200
。
有何高招?
用 superagent 会自动考虑 redirect , gzip/deflate压缩 各种问题…
我最近碰到400问题是中文要encode下 自豪地采用 CNodeJS ionic
好好研究研究吧 我这每天定时取数据都没问题的
我采用 superagent module, 可以抓取acm dl网页,原来问题应该是acm dl网页重定向所导致, 我改写 使用 superagent 与 cheerio 完成简单爬虫,可行。但目前我的程序仍有不少问题,待完善。
网站防抓,ban掉你了 或者是异常访问量太大,被防火墙拦截了
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();
......
'''
@hcnode 用 cheerio 更爽
是的,cheerio还挺方便,我前些天写了个简单的东西爬掉segmentfault的所有标签及描述~哈哈~ 代码略烂,不过目的达到了 simple-tag-spider
抓页面数据 建议用request
我现在考虑 是否可将 express.js 与 jQuery UI相结合,做后端GUI? 不知可行?试一试
@wuxiaoqian88 开始用的request后来换superagent感觉一般使用的话都还好,当时没意识到是控制并发的问题 自豪地采用 CNodeJS ionic
直接用SuperAgent吧
我曾经用superagent来抓取xml流,可惜抓不到,后来换了request才能抓取到,这是何解?
@luoyjx 抓取页面的东西最好支持gzip这些, 不然下载太慢了; 并发控制, 可用async来弄, 页面解析一般用cheerio
@wuxiaoqian88 貌似可以设置GZIP吧,不过我还没试过,看这里https://cnodejs.org/topic/54e96cf7ddce2d471403203f
已经抓取的页面,更新了抓取怎么判断?