hi,node.js 抓取网页数据经常不行?
发布于 2个月前 作者 jiangwest 729 次浏览 来自 问答

奇怪!

  • 当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 回复

关注各类爬虫问题~同问

你需要完整的 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();
                ......
'''             

是的,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

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

回到顶部