PHP的Scraping Library - phpQuery?

时间:2009-10-29 15:46:00

标签: php screen-scraping phpquery

我正在寻找一个PHP库,它允许我废弃网页并关注所有Cookie并使用默认值预填充表单,这就是让我烦恼的原因。

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

有人能帮助我吗?感谢。

@Jonathan Fingland:

在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 :请放心,将用于发送垃圾邮件。

3 个答案:

答案 0 :(得分:2)

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

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

# data Object, String,它将数据参数定义为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功能可以更好地满足您的需求。

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

e.g。

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;
}

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

答案 1 :(得分:1)

我过去曾使用SimpleTest's ScriptableBrowser这样的东西。它是SimpleTest测试框架的一部分,但您可以单独使用它。

答案 2 :(得分:0)

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

要处理HTTP请求,请查看例如。 HttpfulUnirestRequestsGuzzle。 Guzzle现在特别受欢迎,但最终,无论哪个库最适合你,仍然是个人品味的问题。

为解析HTML文件,我建议自己编写一个库:DOM-Query。它允许您(1)加载HTML文件,然后(2)选择或更改HTML的部分内容,就像在前端应用程序中使用jQuery一样。