25

Perl のWWW::Mechanizeに似た機能を持つライブラリを探していますが、PHP 用です。基本的に、単純な構文で HTTP GET および POST 要求を送信し、結果のページを解析して、すべてのフォームとそのフィールド、およびページ上のすべてのリンクを単純な形式で返すことができるようにする必要があります。

私は CURL について知っていますが、それは少し必要最小限であり、構文はかなり醜いです (大量のcurl_foo($curl_handle, ...)ステートメント

説明:

これまでの回答よりもレベルの高いものが欲しいです。たとえば、Perl では、次のようなことができます。

# navigate to the main page
$mech->get( 'http://www.somesite.com/' ); 

# follow a link that contains the text 'download this'
$mech->follow_link( text_regex => qr/download this/i );

# submit a POST form, to log into the site
$mech->submit_form(
    with_fields      => {
        username    => 'mungo',
        password    => 'lost-and-alone',
    }
);

# save the results as a file
$mech->save_content('somefile.zip');

HTTP_Client、wget、または CURL を使用して同じことを行うのは大変な作業です。手動でページを解析して、リンクを見つけたり、フォーム URL を見つけたり、非表示のフィールドをすべて抽出したりする必要があります。私が PHP ソリューションを求めている理由は、私は Perl の経験がなく、多くの作業で必要なものを構築できる可能性があるためですが、PHP で上記を実行できれば、はるかに迅速になります。

4

9 に答える 9

23

SimpleTest のScriptableBrowserは、テスト フレームワークから独立して使用できます。多数の自動化ジョブに使用しました。

于 2008-10-13T23:11:50.980 に答える
3

今は 2016 年で、ミンクがいます。ヘッドレスの純粋な PHP の「ブラウザ」(JavaScript なし) から、Selenium (Firefox や Chrome などのブラウザが必要) から、JavaScript をサポートする NPM のヘッドレスの「browser.js」まで、さまざまなエンジンをサポートします。

于 2016-07-08T08:38:34.083 に答える
3

古い投稿ですが、私はこれに答えざるを得ないと感じています...私はPHPカールをたくさん使ってきましたが、私が切り替えているWWW:Mechanizeのようなものに匹敵するほど良くはありません(私は思う私はRuby言語の実装に行きます..Curlは時代遅れです.何かを自動化するにはあまりにも多くの「単調な作業」が必要なためです.最も単純なスクリプト可能なブラウザは有望に見えましたが、テストではほとんどのWebで動作しません試してみたフォーム...正直なところ、PHPにはこのカテゴリのスクレイピング、Web自動化が欠けていると思うので、別の言語を見るのが最善です。このトピックに数え切れないほどの時間を費やしてきたので、これを投稿したかっただけです。将来誰かの時間を節約するでしょう。

于 2010-07-04T09:40:50.707 に答える
1

次のいずれかを試してください。

(はい、これは ZendFramework コードですが、必要なライブラリをロードするだけなので、クラスの使用が遅くなることはありません。)

于 2008-10-13T21:57:30.100 に答える
1

PEAR ライブラリを調べてみてください。他のすべてが失敗した場合は、curl のオブジェクト ラッパーを作成します。

次のように簡単にできます。

class curl {
    private $resource;

    public function __construct($url) {
        $this->resource = curl_init($url);
    }

    public function __call($function, array $params) {
        array_unshift($params, $this->resource);
        return call_user_func_array("curl_$function", $params);
    }
}
于 2008-10-13T21:14:55.880 に答える
1

スヌーピーを調べる: http://sourceforge.net/projects/snoopy/

于 2008-10-13T23:03:01.280 に答える
1

Curl は、単純な要求に使用する方法です。クロス プラットフォームで動作し、PHP 拡張機能を備え、広く採用され、テストされています。

CurlHandler::Get($url, $data) || を呼び出すだけで、データの配列 (ファイルを含む!) を GET して URL に POST できる素敵なクラスを作成しました。CurlHandler::Post($url, $data)。オプションのHTTPユーザー認証オプションもあります:)

/**
 * CURLHandler handles simple HTTP GETs and POSTs via Curl 
 * 
 * @package Pork
 * @author SchizoDuckie
 * @copyright SchizoDuckie 2008
 * @version 1.0
 * @access public
 */
class CURLHandler
{

    /**
     * CURLHandler::Get()
     * 
     * Executes a standard GET request via Curl.
     * Static function, so that you can use: CurlHandler::Get('http://www.google.com');
     * 
     * @param string $url url to get
     * @return string HTML output
     */
    public static function Get($url)
    {
       return self::doRequest('GET', $url);
    }

    /**
     * CURLHandler::Post()
     * 
     * Executes a standard POST request via Curl.
     * Static function, so you can use CurlHandler::Post('http://www.google.com', array('q'=>'StackOverFlow'));
     * If you want to send a File via post (to e.g. PHP's $_FILES), prefix the value of an item with an @ ! 
     * @param string $url url to post data to
     * @param Array $vars Array with key=>value pairs to post.
     * @return string HTML output
     */
    public static function Post($url, $vars, $auth = false) 
    {
       return self::doRequest('POST', $url, $vars, $auth);
    }

    /**
     * CURLHandler::doRequest()
     * This is what actually does the request
     * <pre>
     * - Create Curl handle with curl_init
     * - Set options like CURLOPT_URL, CURLOPT_RETURNTRANSFER and CURLOPT_HEADER
     * - Set eventual optional options (like CURLOPT_POST and CURLOPT_POSTFIELDS)
     * - Call curl_exec on the interface
     * - Close the connection
     * - Return the result or throw an exception.
     * </pre>
     * @param mixed $method Request Method (Get/ Post)
     * @param mixed $url URI to get or post to
     * @param mixed $vars Array of variables (only mandatory in POST requests)
     * @return string HTML output
     */
    public static function doRequest($method, $url, $vars=array(), $auth = false)
    {
        $curlInterface = curl_init();

        curl_setopt_array ($curlInterface, array( 
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_FOLLOWLOCATION =>1,
            CURLOPT_HEADER => 0));
        if (strtoupper($method) == 'POST')
        {
            curl_setopt_array($curlInterface, array(
                CURLOPT_POST => 1,
                CURLOPT_POSTFIELDS => http_build_query($vars))
            );  
        }
        if($auth !== false)
        {
              curl_setopt($curlInterface, CURLOPT_USERPWD, $auth['username'] . ":" . $auth['password']);
        }
        $result = curl_exec ($curlInterface);
        curl_close ($curlInterface);

        if($result === NULL)
        {
            throw new Exception('Curl Request Error: '.curl_errno($curlInterface) . " - " . curl_error($curlInterface));
        }
        else
        {
            return($result);
        }
    }

}

?>

[編集] 説明は今だけ読んでください...おそらく、上記の自動化ツールのいずれかを使用したいと思うでしょう。柔軟性を高めるために、ChickenFootなどのクライアント側の Firefox 拡張機能を使用することもできます。将来の検索のために、上記のサンプル クラスをここに残しておきます。

于 2008-10-13T23:12:29.763 に答える
1

プロジェクトで CakePHP を使用している場合、または関連するライブラリを抽出する傾向がある場合は、curl ラッパー HttpSocket を使用できます。あなたが説明する単純なページフェッチ構文があります。

# This is the sugar for importing the library within CakePHP       
App::import('Core', 'HttpSocket');
$HttpSocket = new HttpSocket();

$result = $HttpSocket->post($login_url,
array(
  "username" => "username",
  "password" => "password"
)
);

...ただし、応答ページを解析する方法はありません。そのために、私は simplehtmldom を使用します: http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ jQuery に似た構文を持つ。

要するに、PHP には Perl/Ruby が持っているすばらしいスクレイピング/自動化ライブラリがないということです。

于 2011-03-02T14:44:14.593 に答える
-1

*nix システムを使用している場合は、wget で shell_exec() を使用できます。これには多くの便利なオプションがあります。

于 2008-10-13T22:10:35.537 に答える