【问题标题】:Scraping Library for PHP - phpQuery?用于 PHP 的抓取库 - phpQuery?
【发布时间】:2010-12-11 07:23:40
【问题描述】:

我正在寻找一个 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:请放心,这不会用于发送垃圾邮件。

【问题讨论】:

  • +1 没有答案但期待其他 cmets
  • 如今,垃圾邮件发送者的生活相当艰难。
  • 我相信有很多网站管理员和其他运营自己的论坛等的人,如果那里少了一个机器人垃圾邮件发送者,他们会非常高兴。
  • 再一次,你告诉你这是垃圾邮件相关的?
  • 我也需要这样做,而且与垃圾邮件无关..

标签: php screen-scraping phpquery


【解决方案1】:

请参阅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() or click() 方法上调用,因此您可以在此之前填写所有表单字段。

例如

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        相关资源
        最近更新 更多