我正在尝试从首先要求验证码的网站自动收集链接。 为此,我捕获验证码图像,以便可以在外部解决,然后将解决方案作为表单字段的一部分提交。 不知怎的,它不起作用。我怀疑是一个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-&gt;时,cookie是否会丢失/重置?
感谢任何提示!
答案 0 :(得分:1)
您访问的网站很可能有一些方法可以检测并阻碍免费冲浪;这意味着,例如,返回一个或多个页面然后再转发。这通常是通过将每个页面的唯一ID相关联来完成的,这样当您提交两次ID时,很明显您会向后冲浪,然后再从那里继续前进。正如您所说,这与使用back
。
我想知道你真的需要去back
。关键是下载代理的外部图像,以便不修改代理状态。您可以使用第二个代理或curl
,因为您有图像的直接URL ...
答案 1 :(得分:1)
我找到了一种更简单的方法来处理这个问题。这是:
像魅力一样。
$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);