PHPQuery WebBrowser插件 - 使用cookie

Par*_*unt 6 php browser phpquery web-scraping

我正在尝试使用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
}
Run Code Online (Sandbox Code Playgroud)

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

Jan*_*tor 3

我查看了源代码来帮助您解决这个问题。我的第一印象是代码写得非常糟糕。调试代码被注释掉,到处都是拼写错误,一英里长的函数等等。从长远来看,您确实可能需要考虑切换到不同的解决方案,因为如果作者更改了此代码中的某些内容,您最终可能会拥有自己的解决方案升级后代码被破坏。

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

问题是您没有任何方法来设置这些 cookie。您必须在第 102 行附近修补 Web 浏览器插件,以包含您自己的 HTTP 请求对象(参数 2 phpQuery::ajax())以及您的 cookie 设置,如下所示:

$xhr = phpQuery::ajax(array(
    'type' => 'GET',
    'url' => $url,
    'dataType' => 'html',
));
Run Code Online (Sandbox Code Playgroud)

或者,您也可以修补phpQuery.php第 691 行以包含一个全局 cookie jar,您可以将其定义为单例等。(就在它说的地方$client->setCookieJar();)。

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