PHPQuery WebBrowser插件 - 使用cookie

时间:2013-01-23 14:08:00

标签: php browser web-scraping phpquery

我正在尝试使用PHPQuery的WebBrowser插件登录网站。我能够成功登录,但我不确定如何重复使用之前调用的cookie到下一个。

$client = phpQuery::browserGet('https://website.com/login', 'success1');

function success1($browser) {
  $handle = $browser
    ->WebBrowser('success2');
  $handle 
    ->find('input[name=name]')
      ->val('username');
  $handle 
    ->find('input[name=pass]')
      ->val('password')
      ->parents('form')
        ->submit();
}

function success2($browser) {
    print $browser; // prints page showing I'm logged in

    // make authenticated requests here
}

如何使用会话/登录cookie发出其他请求?

1 个答案:

答案 0 :(得分:3)

我已经看了一下源代码来帮助解决这个问题。我的第一印象是代码编写得非常糟糕。调试代码被注释掉,遍布整个地方的拼写错误,里程长的函数等等。从长远来看,你真的可能要考虑切换到不同的解决方案,因为如果作者在这段代码中改变某些东西,你可能最终会拥有自己的代码因升级而中断。

话虽这么说,WebBrowser插件允许您访问浏览器对象本身,其中包含一个名为getLastResponse()的函数。这会返回一个Zend_Http_Response对象,您可以理论上使用该对象来获取Cookie。

问题在于您无法设置这些Cookie。您必须在第102行附近修补Web浏览器插件,以包含您自己的HTTP请求对象(phpQuery::ajax()的参数2),并在此处设置您的Cookie:

$xhr = phpQuery::ajax(array(
    'type' => 'GET',
    'url' => $url,
    'dataType' => 'html',
));

或者你也可以修补phpQuery.php第691行,以包含一个你可以定义为单身的全局cookie jar。 (正好在$client->setCookieJar();)。

同样,这段代码编写得非常糟糕,使用raw curl calls可能会更好,即使它缺少一些功能。