如何在不同的casperjs进程之间保留cookie

abb*_*ood 28 cookies session node.js phantomjs casperjs

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

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

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

第一:当我产生工人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();
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 有人提到早些时候start从页面删除cookies吗?如果是这样我该怎么做呢?
  2. 我知道会话持久同一phantomjs页面对象中(见这里https://gist.github.com/abbood/5347252)和相同casperjs页面对象中的同样的情况(见这里https://gist.github.com/ abbood/5347287)
  3. 请记住,我将cookie存储在文件中(即根本没有任何json/cookie解析)..所以我的cookie文件看起来就像这样

[一般]饼干="@变体(\ 0\0\0\0x7F部分\ 0\0\0\x16QList\0\0\0\0\X1\0\0\0 \n\0\0\0YCNTR = LB; expires = Tue,09-Apr-2013 17:12:05 GMT; domain = .recruiter.domain.com; path = /\0\0\_ :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -mar-2015 16点12分18秒GMT;域= .domain.com;路径= /\0\0\0] UIDR = 1365523938;期满=星期一,30-MAR-2015 16点12分18秒GMT;域= .domain.com; path = /\0\0\0 [R_LANG = en; expires = Thu,09-May-2013 16:16:06 GMT; domain = .recruiter.domain.com; path = /\0\0\0\X94\X43 = 4gpUmUGr2jgDrs4xOJVrGaNbD8DtYSd1E6quyLhe3E4F3EAGhbRJucnDgRVDeHh0;期满=星期四,09可能 - 2013 16时16分06秒GMT;域= .recruiter.domain.com;路径= /\0\0\0\x94WT_FPC = ID = 20cf093f17f2c6f3d041365495136954 :LV = 1365495369854:SS = 1365495136954;期满=星期五,07-APR-2023 8点16分09秒GMT;域= .domain.com;路径= /\0\0\0\XC4\X41\x43OOKIE = C8ctADE3OC4xMzUuMTQ3LjM5LTI4NzQ5NzQ0LjMwMjkxMjYxAAAAAAAAAAABAAAAmyoBAMo + ZFHhPWRRAQAAAAJWAADKPmRR4T1kUQAAAAA-;到期=星期四,09-APR-2015十六时16分10秒GMT;域= statse.domain.com;路径= /\0\0\0Yv1st = CE061E87215F2D73;前 pires = Wed,19-Feb-2020 14:28:00 GMT; 域= .domain.com; 路径= /\0\0\0\X84\x43OOKIE_ID = 178.135.147.39-2368749744.30291261; 到期=周五,07年4月7日至2023年16:16:11 GMT; 域= cookie.domain.com; 路径=/DCS000065_7K5I\0\0\0\XBE\X41\x43OOKIE = C8ctADE3OC4xMzUuMTQ3LjM5LTIzNjg3NDk3NDQuMzAyOTEyNjEAAAAAAAABAAAAQQAAAM0 + ZFHNPmRRAQAAAAEAAADNPmRRzT5kUQAAAAA-; 到期=周五,07年4月7日 - 2023年16:16:13 GMT; 域= cookie.domain.com; 路径= /)"

imo*_*mos 65

保存饼干:

var fs = require('fs');
var cookies = JSON.stringify(phantom.cookies);
fs.write(cookieFilename, cookies, 644);
Run Code Online (Sandbox Code Playgroud)

恢复cookie:

var fs = require('fs');
var data = fs.read(cookieFilename);
phantom.cookies = JSON.parse(data);
Run Code Online (Sandbox Code Playgroud)

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

  • 登录如果堆栈溢出上的cookie示例:https://github.com/cirosantilli/stack-overflow-vote-fraud-script/blob/1477d09ae365c2997ded514539898efd55171091/vote.js注意:1)默认情况下,CasperJS可以使用`phantom`,no需要它.2)`fs`也是PhantomJS的一部分:http://phantomjs.org/api/fs/method/is-file.html不可更改的节点之前的东西:http://stackoverflow.com/questions/15745394/can -phantomjs-工作与节点-JS (2认同)

Ryg*_*guy 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]);
}
Run Code Online (Sandbox Code Playgroud)

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