【问题标题】:Node.js Scraping ASU CourseNode.js Scraping ASU 课程
【发布时间】:2012-01-13 22:18:21
【问题描述】:

我对 Node.js 很陌生,所以如果我不知道我在说什么,请提前道歉。

我正在尝试从 ASU 的课程目录 (https://webapp4.asu.edu/catalog/) 中删除一些课程,并使用 Zombie、Node.IO 和 HTTPS api 进行了多次尝试。在这两种情况下,我都遇到了重定向循环。

我想知道是不是因为我没有正确设置标题?

以下是我使用的示例代码(不是 Zombie/Node.IO):

var https = require('https');

var option = {
  host: 'webapp4.asu.edu',
  path: '/catalog',
  method: 'GET',
  headers: {
    'set-cookie': 'onlineCampusSelection=C'
  }
};

var req = https.request(options, function(res) {
console.log("statusCode: ", res.statusCode);
console.log("headers: ", res.headers);
  res.on('data', function(d) {
    process.stdout.write(d);
  });
});

澄清一下,我一般不会遇到使用 Node.js 进行抓取的问题。然而,更具体地说,是 ASU 的课程目录给我带来了麻烦。

感谢你们能给我的任何想法,谢谢!

更新:如果我使用从 Chrome/FF 获得的 JSESSIONID 创建一个 cookie,我的请求将成功通过。有没有办法让我请求/创建一个 JSESSIONID?

【问题讨论】:

标签: javascript node.js screen-scraping zombie.js


【解决方案1】:

看起来服务器设置了 JSESSIONID cookie,然后重定向,所以如果你想获取 cookie,你需要告诉 node.js 不要跟随重定向。我不知道如何使用 httphttps 包来执行此操作,但是您可以通过 npm 获得另一个包:request,它可以让您做到这一点。这是一个可以帮助您入门的示例:

var request = require("request");

var options = {
  url: "https://webapp4.asu.edu/catalog/",
  followredirect: false,
}

request.get(options, function(error, response, body) {
  console.log(response.headers['set-cookie']);
});

输出应该是这样的:

[ 'JSESSIONID=B43CC3BB09FFCDE07AE6B3B702717431.catalog1; Path=/catalog; Secure' ]

【讨论】:

  • 谢谢!它遵循了让我陷入循环的重定向。
【解决方案2】:

强烈建议将jsDOM jQuery(for node) 结合使用。我已经多次使用它来进行缩放,因为它非常容易。

这是 jsdom 的自述文件中的示例:

// Count all of the links from the nodejs build page
var jsdom = require("jsdom");

jsdom.env("http://nodejs.org/dist/", [
  'http://code.jquery.com/jquery-1.5.min.js'
],
function(errors, window) {
  console.log("there have been", window.$("a").length, "nodejs releases!");
});

希望对您有所帮助,jsdom 让拼凑抓取实验变得非常容易(至少对我而言)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多