@kidult ,谢谢回复,考虑到目前有些技术难度,所以打算找人一起实现呢,工期大约半年,因为目前也是在职,所以可能是业余时间搞,估计会耗费很多休息时间,如果报低了觉得不合算,要个 30 万中不中
下载下来的图片怎么 render 到页面啊?搞了半天没出来
我做
我建立的任务,项目组的其他人可以删除?
任务没有设定日期的功能?
直接找一个会前端的 railser 就 OK 了,告诉他你的 repo,一切就 ok 了
@wudixiaotie Mechanize 能够自动管理 cookie,不需要你 load 一个文件的,之所以用 casperjs 是因为它能够抓取动态内容,mechanize 在这方面还没法做到
@wudixiaotie ,你抓包看一下,在密码框的 keydown 或者 keyup 事件上肯定是绑了事件的,这个事件就是 ajax 请求拿到服务器的 public_key,然后再发送登录请求的时候肯定是把用户输入的密码进行 rsa 加密的了,所以我觉得我们只是利用 setAttribute('value', usr) 或者 attr('val') 肯定是不会触发这个事件的,所以在登录请求的时候肯定是密码错误的
@wudixiaotie 你在
BID.popLogin();
的后面加上
this.__utils__.echo('-----------------------')
this.__utils__.echo(this.__utils__.visible('input#TANGRAM_18__userName'))
this.__utils__.echo(this.__utils__.visible('input#TANGRAM_18__password'))
this.__utils__.echo('-----------------------')
试试,我用你的代码测试了下,发现也没面上的这连个 input 并没有显示出来。另外,这个是我的代码;
var utils = require('utils');
var casper = require('casper').create({
verbose: true,
logLevel: "debug"
});
casper.userAgent('Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:18.0) Gecko/20130119 Firefox/18.0')
var usr = casper.cli.get(0);
var passwd = casper.cli.get(1);
var index_url = 'http://index.baidu.com/';
casper.start(index_url);
casper.wait(1000, function(){
this.click('li.navli a[href="javascript:BID.popLogin();"]');
this.wait(1000,function(){
this.thenEvaluate(function(usr,passwd){
this.__utils__.echo('-----------------------')
this.__utils__.echo(this.__utils__.visible('input#TANGRAM_18__userName'))
this.__utils__.echo(this.__utils__.visible('input#TANGRAM_18__password'))
this.__utils__.echo('-----------------------')
document.querySelector('#TANGRAM_18__userName').setAttribute('value', usr);
document.querySelector('#TANGRAM_18__password').setAttribute('value', passwd);
this.wait(1000,function(){
this.click('#TANGRAM_18__submit');
});
},{ 'usr' : usr, 'passwd' : passwd });
this.wait(1000,function(){
this.evaluate(function(){
if(this.__utils__.exists('#ubarUname')){
this.__utils__.log('-----------login success')
}else{
this.__utils__.log('-----------login faild')
if(this.__utils__.visible('#TANGRAM_18__error')){
this.__utils__.log('password error ------------')
}else{
this.__utils__.log('password not error ------------')
}
if(this.__utils__.visible('#TANGRAM_18__verifyCodeImgWrapper')){
this.__utils__.log('need verify code ------------')
}else{
this.__utils__.log('need not verify code ------------')
}
}
})
})
});
});
casper.run();
打印出来是
[debug] [remote] -----------login faild
[debug] [remote] password error ------------
[debug] [remote] need not verify code ------------
从打印出来的结果看,是登陆失败的,失败的原因是密码错误。所以我想,应该是没有调用 js 的加密函数,这也就是我想问的,怎样才能执行这个加密函数,因为我不像费劲的去破解它的加密规则,想让 phantomjs 模拟 webkit 去自动执行。
@sunday35034 这个 gem 貌似不准吧
@wudixiaotie ,有时间的话,可以看下百度指数的页面:http://index.baidu.com
这里的登录用的是非对称加密,我试着登录,发现总是会收到用户名或密码错误的提示,觉得应该是客户端加密的代码没有在 casperjs 里面执行导致的,所以不知道 casperjs 能否直接执行这些加密代码,如果能的话,就没必要自己破解了。还有个问题就是,如果我用代理的话,只要是境外的代理,必然让我输入验证码,这个验证码不知道楼主是怎么解决的,难不成每次都要请求下验证码的地址,拿到图片后人工识别并手动输入?
@wudixiaotie 如果爬虫的目标网站需要登录,并且是那种 js popup 那种,而且在 input 筐中的 password 是经过客户端 js 加密处理的,这种情况是不是也可以用 casperjs 解决,因为发现只要目标网站的加密规则一变,自己就得重新处理解密的代码,所以,我想,能不能直接利用 casperjs 来跑目标网站的加密 js,不知道你有遇到过这种情况没有
@flowerwrong 那直接就 node + phantomjs 算了
@flowerwrong ,你说的性能问题指的是哪里?查找元素的时候还是在模拟用户操作的时候?
phantomjs 不错,还有个适用于 capybara 的 driver,叫 poltergeist,有需要的可以研究一下
@AlphaLiu 好吧,说服我了。。。。
谢谢两位的指点
@andor_chen ,邮件已经发送,有时间的话可以看一下。
今天晚上啊,就是从帖子的链接中进去的,但是我进入的是http://leanpub.com/deploying_rails_applications-cn/c/2014Tanabata
@andor_chen ,我只收到了这个,其他的邮件没有收到
@andor_chen 已在 leanpub 上购买,怎样能确认收到货?
@huacnlee 谢谢指点,经过验证,确实是,而且是存储在当前的 agent 对象的。在使用中还遇到一个问题就是,在某些页面中的登录框是 js 生成的一个 popup,对于这样的页面内容,machanize 应该是抓取不到的,这种情况要用什么处理?capybara 么?
@huacnlee 有个问题想问你,按照你所说:“模拟表单填写帐号密码,然后提交表单就可以了呀,不用 hack Cookie 的”,意思是说,只要用 machanize 在目标网站登录一次了,以后的每个页面的请求都不用再次登录了?比如说,有个目标网站,我访问前 3 个页面的时候不需要我登录,但是第四个的时候就把我 redirect 到了登录页面,这个时候我用 machanize 登录,目标网站的 server 端记住了我的 session 并在浏览器中设置了 session_id 的一个 cookie 那我在以后的页面访问的时候,都是自动带着这个 cookie 的?如果是这样的话,machanize 是怎那样抓取到 cookie 并在下次的 request 中带着这个 cookie 的?