8

我正在寻找一个 PHP 库,它允许我删除网页并处理所有 cookie 并使用默认值预填充表单,这是最让我烦恼的。

我厌倦了必须将每个输入元素与 xpath 匹配,如果存在更好的东西,我会很高兴。我遇到过phpQuery,但手册不是很清楚,我不知道如何发出 POST 请求。

有人能帮我吗?谢谢。

@乔纳森芬兰:

在 browserGet() 手册提供的示例中,我们有:

require_once('phpQuery/phpQuery.php');

phpQuery::browserGet('http://google.com/', 'success1');

function success1($browser)
{
    $browser->WebBrowser('success2')
    ->find('input[name=q]')->val('search phrase')
    ->parents('form')
    ->submit();
}

function success2($browser)
{
    echo $browser;
}

我想所有其他字段都被废弃并在 GET 请求中发回,我想对 phpQuery::browserPost() 方法做同样的事情,但我不知道该怎么做。我试图抓取的表单有一个输入令牌,如果 phpQuery 可以足够聪明地抓取令牌并让我更改其他字段(在本例中为用户名和密码),我希望通过 POST 提交所有内容。

PS:请放心,这不会用于发送垃圾邮件。

4

3 回答 3

2

请参阅http://code.google.com/p/phpquery/wiki/Ajax,特别是:

phpQuery::post($url, $data, $callback, $type)

# data Object, String它将数据参数定义为对象或字符串。POST 请求应该可以使用查询字符串格式,例如:

$data = "username=Jon&password=123456";
$url = "http://www.mysite.com/login.php";
phpQuery::post($url, $data, $callback, $type)

因为 phpQuery 是一个 jQuery 端口,所以方法签名是相同的(文档直接链接到 jquery 站点——http: //docs.jquery.com/Ajax/jQuery.post

编辑

两件事情:

还有一个phpQuery::browserPost功能可以更好地满足您的需求。

但是,还请注意,success2 回调仅在submit()orclick()方法上调用,因此您可以在此之前填写所有表单字段。

例如

require_once('phpQuery/phpQuery.php');
phpQuery::browserGet('http://www.mysite.com/login.php', 'success1');
function success1($browser) {
  $handle = $browser
    ->WebBrowser('success2');
  $handle 
    ->find('input[name=username]')
      ->val('Jon');
  $handle 
    ->find('input[name=password]')
      ->val('123456');
      ->parents('form')
        ->submit();
}
function success2($browser) {
  print $browser;
}

(请注意,这尚未经过测试,但应该可以工作)

于 2009-10-29T16:00:19.813 回答
1

过去,我曾使用SimpleTest 的 ScriptableBrowser处理此类内容。它是 SimpleTest 测试框架的一部分,但您可以单独使用它。

于 2009-10-29T20:12:59.590 回答
0

我会使用一个专门的库来解析 HTML 文件和一个专门的库来处理 HTTP 请求。对两者使用相同的库似乎是个坏主意,IMO。

要处理 HTTP 请求,请查看例如。Httpful, Unirest,RequestsGuzzle. Guzzle 现在特别流行,但最终,哪个库最适合您仍然是个人喜好问题。

对于解析 HTML 文件,我会推荐一个我自己编写的库:DOM-Query. 它允许您 (1) 加载 HTML 文件,然后 (2) 选择或更改 HTML 的部分内容,这与您在前端应用程序中使用 jQuery 的方式几乎相同。

于 2016-01-14T01:13:15.583 回答