28

这是一个关于如何将 cookie 从一个 casperjs 页面持久保存到另一个页面的问题。

所以基本上我得到了一个 nodejs 文件,它生成 casperjs 作为工作人员来执行某些任务。一个是登录,一旦登录,我将 cookie 存储在一个文件中。

当我产生下一个 casper worker 时..我希望它使用 cookie 而不必再次登录..这两种方法都失败了

首先:当我生成worker capserjs时,我添加了--cookies-file=./cookiefilename ie var child = spawn('casperjs',['scrape.js','--cookies-file=./'+cookieFileName]);

第二:在casperjs工作文件中..我让它从一个文件中读取并设置cookie,即

var casper = require('casper').create();
var cookieFileName = 'monsterCookie.txt';

// grab cookies from file 
var fs = require('fs');
var utils = require('utils');
var cookies = fs.read(cookieFileName);

casper.page.setCookies(cookies); 

casper.start('domain/page.html', function() {
    //FAIL! cookies aren't used here
    this.debugHTML();
});

casper.run();

笔记:

  1. 前面提到从页面中start删除cookie?如果是这样,我该如何防止?
  2. 我知道会话在同一个 phantomjs 页面对象中持续存在(参见此处https://gist.github.com/abbood/5347252),并且在同一个 casperjs 页面对象中发生同样的情况(参见此处https://gist.github.com/阿布德/5347287 )
  3. 请记住,我将 cookie 按原样存储在文件中(即根本没有任何 json/cookie 解析).. 所以我的 cookie 文件看起来完全像这样

路径=/\0\0\0\xc4\x41\x43OOKIE=C8ctADE3OC4xMzUuMTQ3LjM5LTI4NzQ5NzQ0LjMwMjkxMjYxAAAAAAAAAAAAAAAAmyoBAMo+ZFHhPWRRAQAAAAJWAADKPmRR4T1kUQAAAAAA-; 到期=格林威治标准时间 2015 年 4 月 9 日星期四 16:16:10;域=statse.domain.com;路径=/\0\0\0Yv1st=CE061E87215F2D73;到期=格林威治标准时间 2020 年 2 月 19 日星期三 14:28:00;域=.domain.com;路径=/\0\0\0\x84\x43OOKIE_ID=178.135.147.39-2368749744.30291261;过期=格林威治标准时间 2023 年 4 月 7 日星期五 16:16:11;域=cookie.domain.com;路径=/DCS000065_7K5I\0\0\0\xbe\x41\x43OOKIE=C8ctADE3OC4xMzUuMTQ3LjM5LTIzNjg3NDk3NDQuMzAyOTEyNjEAAAAAAAABAAAAQQAAAM0+ZFHNPmRAQAAAAAEAAADNPmRRzT5kUQAAAAAA-; 过期=格林威治标准时间 2023 年 4 月 7 日星期五 16:16:13;域=cookie.domain.com;路径=/)" 到期=格林威治标准时间 2020 年 2 月 19 日星期三 14:28:00;域=.domain.com;路径=/\0\0\0\x84\x43OOKIE_ID=178.135.147.39-2368749744.30291261;过期=格林威治标准时间 2023 年 4 月 7 日星期五 16:16:11;域=cookie.domain.com;路径=/DCS000065_7K5I\0\0\0\xbe\x41\x43OOKIE=C8ctADE3OC4xMzUuMTQ3LjM5LTIzNjg3NDk3NDQuMzAyOTEyNjEAAAAAAAABAAAAQQAAAM0+ZFHNPmRAQAAAAAEAAADNPmRRzT5kUQAAAAAA-; 过期=格林威治标准时间 2023 年 4 月 7 日星期五 16:16:13;域=cookie.domain.com;路径=/)" 到期=格林威治标准时间 2020 年 2 月 19 日星期三 14:28:00;域=.domain.com;路径=/\0\0\0\x84\x43OOKIE_ID=178.135.147.39-2368749744.30291261;过期=格林威治标准时间 2023 年 4 月 7 日星期五 16:16:11;域=cookie.domain.com;路径=/DCS000065_7K5I\0\0\0\xbe\x41\x43OOKIE=C8ctADE3OC4xMzUuMTQ3LjM5LTIzNjg3NDk3NDQuMzAyOTEyNjEAAAAAAAABAAAAQQAAAM0+ZFHNPmRAQAAAAAEAAADNPmRRzT5kUQAAAAAA-; 过期=格林威治标准时间 2023 年 4 月 7 日星期五 16:16:13;域=cookie.domain.com;路径=/)"

4

2 回答 2

66

保存 cookie:

var fs = require('fs');
var cookies = JSON.stringify(phantom.cookies);
fs.write(cookieFilename, cookies, 644);

恢复 cookie:

var fs = require('fs');
var data = fs.read(cookieFilename);
phantom.cookies = JSON.parse(data);

phantom是 PhantomJS 中的全局变量。您可以在wiki中获得更多信息

于 2013-06-06T05:20:19.233 回答
10

@imos 很好的答案!它只是帮助了我,我希望我可以添加更多。

您还可以使用以下方法将单个 cookie 添加到页面:

var fs = require('fs')
var data = fs.read(file)
var cookies = JSON.parse(data)

for(var i = 0; i < cookies.length; i++) {
    phantom.addCookie(cookies[i]);
}

如果有多个 cookie 文件,这可能会有所帮助。

于 2013-07-17T23:07:54.887 回答