【问题标题】:Struggling to scrape asp.net with PHP努力用 PHP 抓取 asp.net
【发布时间】:2016-02-17 15:08:57
【问题描述】:

我正在尝试使用 PHP (5.6) 和 libcurl 废弃网站。

该站点在 asp.net 中实现,并通过本地代理访问。站点使用 HTTPS,因此不太容易通过网络发送未加密的流量。

我在第一步失败 - 登录。

$curl_options = array(
     CURLOPT_RETURNTRANSFER => true,
     CURLOPT_HEADER         => false,
     CURLOPT_SSL_VERIFYPEER => false,
     CURLOPT_PROXY          => 'http://localproxy.example.com:8080',
     CURLOPT_PROXYUSERPWD   => "$proxyUser:$proxyPass",
     CURLOPT_PROXYAUTH      => CURLAUTH_NTLM,
     CURLOPT_FOLLOWLOCATION => true,
     CURLOPT_WRITEHEADER    => false,
     CURLOPT_COOKIEJAR      => $curl_cookie_jar,
     CURLOPT_COOKIEFILE     =>  $curl_cookie_jar
 );

 ...
 $ch=curl_init();
 curl_setopt($ch, CURLOPT_URL, $entryurl);
 curl_setopt_array($ch, $curl_options);
 $reply=curl_exec($ch);
 curl_close($ch);
 ...
 $postdata=array(
     'username'=>'someuser', 'password'=>'s3cr3t',
     '__VIEWSTATE'=>$vstate, '__VIEWSTATEGENERATOR'=>$vsgen
 );

 $ch=curl_init();
 curl_setopt_array($ch, $curl_options);
 curl_setopt($ch,  CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postdata));
 $reply=curl_exec($ch);

在浏览器中,事件顺序如下:

  1. GET / 导致 302 重定向到 /Login.aspx?ReturnUrl=%2fIndex.aspx
  2. 重定向位置返回的登录页面
  3. 用户输入用户名和密码并点击提交类型的输入
  4. 用户名、密码、提交和 2 个隐藏输入(__VIEWSTATE 和 __VIEWSTATEGENERATOR)被 POST 回相同的 URL (/Login.aspx?ReturnUrl=%2fIndex.aspx)
  5. 服务器响应 302 重定向到 /Index.asp
  6. 浏览器检索 Index.asp(作为经过身份验证的用户)

但是,当我使用 PHP 脚本尝试此操作时,在第 4 步之后,响应为第 2 步。

我尝试将脚本指向本地非 SSL 网站,以检查 Curl 是否按照我的预期进行。是的。

分析

  1. 正在捕获和重放 Cookie
  2. 所有必需的变量(包括 __VIEWSTATE 和 __VIEWSTATEGENERATOR)正在被填充并在 POST 中发回
  3. 内容未被缓存 - 在 GET 和 POST 之间插入人为延迟会导致响应的时间戳不同
  4. 虽然会话似乎正在工作,但服务器响应就像 POST 是没有参数的 GET - 如果在浏览器中提供了无效的用户名或密码,则响应不同,但 GET 和 POST 都来自抓取返回相同的 HTML。

我已尝试添加浏览器中生成的所有额外标头(User-Agent、Accept、Accept-Language),但没有任何影响。

【问题讨论】:

  • 遗憾的是,我使用来自mishainthecloud.com/2009/12/… 的代码得到了完全相同的结果,这让我认为它对于我试图抓取的网站(或我正在经历的代理)非常具体

标签: php asp.net curl


【解决方案1】:

我的问题是我不明白curl 仅将 cookie 写入COOKIEJAR 并且仅 从COOKIEFILE 读取。事实上,如果它们不在来自服务器的最后响应中,它似乎会从 COOKIEJAR 中删除 cookie(仍然没有完全描述这一点)。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2013-10-31
    • 2019-05-15
    相关资源
    最近更新 更多