无法使用WWW :: Mechanize或LWP :: UserAgent POST ASP-NET表单

时间:2013-04-01 13:25:47

标签: asp.net-mvc perl web-crawler www-mechanize lwp-useragent

我需要自动提取产品目录,我们是授权经销商。该公司是Ingram Micro,它们很庞大,但是他们没有提供一种简单的方法(比如Web服务)来查询他们的目录和库存,所以我们一直用LWP :: UserAgent提取它到目前为止,每天,我们的在线商店数据库。

最近,他们改变了他们的网站,有些东西我无法检测到阻止我的Perl脚本成功登录。如果我直接尝试浏览器,我会成功登录,但如果我尝试从Perl提交表单,我会再次获取登录页面(如登录失败)。

他们的网站是在AspNet上制作的,并且包含ASP生成的隐藏表单字段。起初,我正在做自己的'蜘蛛'来获取登录页面,读取所有隐藏的字段值并将其包含在我的POST登录请求中以及用户名和密码,但现在,在此问题之后,我开始使用WWW: :机械化以执行请求并使该任务自动正确。

但是,WWW :: Mechanize或LWP :: UserAgent无法成功登录。

我甚至尝试查看浏览器和服务器之间的确切HTTP对话,并在我的自动请求中使用正确的POST内容包含相同的标题,甚至这样做我从Perl获得了不成功的登录从浏览器成功登录。

我真的很绝望,我无法检测到问题,如果没有此目录更新,我们无法运行商店。

您可以在此处查看登录页面:https://www.imstores.com/ingrammicromx/

如果有人有类似问题的经验,或者有人可以查看该页面并检测浏览器与WWW :: Mechanize请求的不同之处,请告知我们。

谢谢。

1 个答案:

答案 0 :(得分:5)

通常我用这种方式测试错误:

  1. 清除浏览器中的所有Cookie
  2. 禁用Javascript
  3. 打开登录页面
  4. 尝试登录
  5. 如果您已成功登录,而无需使用WWW :: Mechanize,则不要忘记使用button => "submit_button_name"这样的:

    $mech->submit_form(
        with_fields => {
            login_field_field => $login,
            password_field_name => $password,
        },
        button => "submit_button_name",
    );
    

    即使您无法在禁用Javascript的情况下从浏览器登录,您仍然可以使用Mechanize执行此操作,但您需要查看浏览器的HTTP请求(我使用HTTPFox)并使完全相同的请求<来自Mechanize的/ strong>(包括标题)。