【问题标题】:Empty body in a response when using request使用请求时响应中的空正文
【发布时间】:2013-12-08 21:49:57
【问题描述】:

我有以下代码:

var request = require('request');
var cheerio = require('cheerio');
var URL = require('url')
var fs = require('fs')
fs.readFile("urls.txt", 'utf8', function(err, data) {
    if (err) throw err;
    var urls = data.split('\n');
    urls = urls.filter(function(n){return n});
    for(var i in urls) {
        request(urls[i], function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body,{lowerCaseTags: true, xmlMode: true});
            $('item').each(function(){
                console.log("----------");
                console.log($(this).find('title').text());
                console.log($(this).find('link').text());
                console.log($(this).find('pubDate').text());
            });
        }).end();
    }
});

从 urls.txt 文件中我只有以下网址:

http://www.visir.is/section/?Template=rss&mime=xml

当我在那个 url 上使用 wget 时,我得到一个看起来像 rss 提要的响应,但是当我在上面的代码中这样做时,正文是空的。有人可以向我解释为什么以及如何解决这个问题吗?

【问题讨论】:

  • .end() 是多余的,你能把它去掉检查一下吗?
  • 另外,请求操作是异步的,您的 for 循环可能无法按预期工作。使用async 模块以串联/并行方式加载适合的url。

标签: node.js request web-scraping cheerio


【解决方案1】:

更新:只需从原始脚本中删除 .end() 即可。 end() 在回调时终止脚本。 IMO,在 2016 年,我肯定会选择 Request over Needle。


Request 是一只奇怪的鸟,为什么它在你的情况下不起作用,它根本没有在响应中提供任何信息。

改用Needle

var needle = require('needle');
var cheerio = require('cheerio');
var URL = require('url')
var fs = require('fs')
fs.readFile("urls.txt", 'utf8', function(err, data) {
    if (err) throw err;
    var urls = data.split('\n');
    urls = urls.filter(function(n){return n});
    for(var i in urls) {
        needle.get(urls[i], function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body,{lowerCaseTags: true, xmlMode: true});
            $('item').each(function(){
                console.log("----------");
                console.log($(this).find('title').text());
                console.log($(this).find('link').text());
                console.log($(this).find('pubDate').text());
            });
        });
    }
});

【讨论】:

  • 感谢您的帮助!
  • 对我来说,当我将 {follow:True} 添加到 needle 的选项中时,它起作用了。这有所不同:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-09
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多