NodeJS - 如何从服务器响应中获取cookie

8
我希望使用nodeJS作为网站抓取工具。我已经实现了一个脚本,可以让我登录系统并从页面解析一些数据。
步骤如下:
1. 打开登录页面 2. 输入登录数据 3. 提交登录表单 4. 转到所需页面 5. 抓取和解析页面上的值 6. 将数据保存到文件中 7. 退出
显然,问题是每次我的脚本都需要进行登录,我想要消除这种情况。我想要实现一种cookie管理系统,在其中可以将cookies保存到.txt文件中,然后在下一次请求期间,可以从文件中加载cookies,并将其发送到请求头中。
这种cookie管理系统不难实现,但问题是如何在nodejs中访问cookies?我发现唯一的方法是使用请求响应对象,在其中可以使用类似以下内容的代码:
 request.get({headers:requestHeaders,uri: user.getLoginUrl(),followRedirect: true,jar:jar,maxRedirects: 10,},function(err, res, body) {
        if(err) {
            console.log('GET request failed here is error');
            console.log(res);
        }

        //Get cookies from response
        var responseCookies = res.headers['set-cookie'];
        var requestCookies='';
        for(var i=0; i<responseCookies.length; i++){
            var oneCookie = responseCookies[i];
            oneCookie = oneCookie.split(';');
            requestCookies= requestCookies + oneCookie[0]+';';
        }
    }
);

现在,变量requestCookies的内容可以保存到.txt文件中,并在下次脚本执行时加载,这样就可以避免每次执行脚本时都需要登录用户的过程。

这是正确的方法吗?还是有一种返回cookies的方法?

注意:如果您想设置您的request对象在每次后续请求中自动重新发送接收到的cookie,请在对象创建过程中使用以下行:

var request = require("request");
request = request.defaults({jar: true});//Send cookies on every subsequent requests

1
为什么不在NodeJS中将cookie存储到引用变量中?如果您想将其保存到文件中,可以通过NodeJS的fs模块甚至是localstorage实现。 - Pogrindis
2
保存cookies(文件、本地存储等)并不是问题,问题是“从服务器获取cookies是否是一个好的方法”。 - MrD
1
我不明白为什么会有问题,你已经拥有了cookie,而且没有重新请求它。你是在保存它以备后用。可能出了什么问题? - Pogrindis
2
我可能错了,但据我所知,没有内置的函数来检索cookie,你写得和其他任何东西一样好! - Pogrindis
1
那太完美了,谢谢! - MrD
显示剩余2条评论
3个回答

10

在我的情况下,我使用了如下的 'http' 库:

http.get(url, function(response) {
    variable = response.headers['set-cookie'];
})

1

这个函数从服务器响应中获取特定的cookie值(使用TypeScript):

function getResponseCookieValue(res: Response, param: string) {
    const setCookieHeader = res.headers.get('Set-Cookie');
    const parts = setCookieHeader?.match(new RegExp(`(^|, )${param}=([^;]+); `));
    const value = parts ? parts[2] : undefined;
    return value;
}

-2

我个人使用Axios。

  axios.request(options).then(function (response) {
  console.log(response.config.headers.Cookie)
}).catch(function (error) {
      console.error(error)
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接