我正试图自动化从一个网站的链接收集,要求验证码首先。为此,我捕获了验证码图像,以便可以在外部解决它,然后将解决方案作为表单域的一部分提交。不知何故,它不起作用。我怀疑是cookie问题,但我不确定,如果有人能解决这个问题,我将不胜感激。
下面是代码。首先,我创建了mech对象及其cookie jar:
$cookie_jar = HTTP::Cookies->new;
$agent = WWW::Mechanize->new(cookie_jar => $cookie_jar);
$agent->get("http://www.site.com/page.html");我找到了感兴趣的链接:
$link = $agent->find_link(tag => "a", text_regex => qr{regex});
$url = $link->url;
$agent->get($url);在这个阶段,站点提供了验证码。我提取图像并保存它,这样人类就可以解决它,然后进入解决方案继续:
$captcha = $agent->find_image(url_regex => qr{captcha\.php});
$agent->get($captcha->url, ':content_file' => 'captcha.jpg');
print "Please solve captcha at http://my.own.site/captcha.jpg\n";
$agent->back;
print "Enter answer: ";
$solved = <>;现在脚本已经手动输入了验证码解决方案,它可以通过提交表单继续:
$agent->form_with_fields('code');
$agent->set_fields(code => $solved, action => 'download');
$agent->submit;然而,这并不起作用。结果是页面再次询问验证码,而不是我想要的带有信息的预期页面。
我想知道当我在保存验证码图像后执行$agent->back时,cookie是否丢失/重置?
谢谢你的任何提示!
发布于 2011-08-14 10:01:34
我找到了一种更简单的方法来处理这个问题。这就是它:
设置cookie <>G29
就像一种护身符。
$phpsessid = '4d93c8f247b49780';
$cookie_jar = HTTP::Cookies->new;
$agent = WWW::Mechanize->new(cookie_jar => $cookie_jar);
$agent->get($url);
$cookie_jar->clear;
$cookie_jar->set_cookie(undef, "SESSIONID", $sessionid, "/", $domain, undef, 1, 0, undef, 1);发布于 2011-08-12 23:53:08
你正在访问的网站很可能已经有了一些方法来检测和阻碍自由浏览;这意味着,例如,返回一个或多个页面,然后再前进。这通常是通过将一个唯一的id关联到每个页面来实现的,这样当您两次提交id时,就可以清楚地看到您浏览回来,然后再从那里继续浏览。正如您所说,这与使用back有关。
我想知道的是,你是否真的需要去back。关键是将镜像下载到代理之外,这样代理状态就不会被修改。您可以使用第二个代理或curl,因为您有指向图像的直接URL…
https://stackoverflow.com/questions/7042325
复制相似问题