奇怪!
- 当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
20 回复
我在代码中加入
console.log( 'statusCode:' + res.statusCode);
Response.StatusCode状态代码返回为: statusCode: 302
,似乎表示URL地址为临时地址?
HTTP Status Codes 302:Redirection。(客户端浏览器必须采取更多操作来实现请求。)
我估计要考虑 重定向 问题,先试试!
而可以成功抓取网页时,statusCode: 200
。
有何高招?
我采用 superagent module, 可以抓取acm dl网页,原来问题应该是acm dl网页重定向所导致, 我改写 使用 superagent 与 cheerio 完成简单爬虫,可行。但目前我的程序仍有不少问题,待完善。
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();
......
'''