PerlのWWW :: Mechanizeに相当するPHPはありますか?
-
11-07-2019 - |
質問
Perlの WWW :: Mechanize 、ただしPHP用。基本的に、単純な構文でHTTP GETおよびPOSTリクエストを送信し、結果のページを解析して、すべてのフォームとそのフィールド、ページ上のすべてのリンクを単純な形式で返すことができます。
CURLについては知っていますが、少し骨が折れすぎており、構文はかなりtheいです( 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で上記を行うことができれば、はるかに速くなります。
解決
SimpleTestの ScriptableBrowser は、テストフレームワークから独立して使用できます。多数の自動化ジョブに使用しました。
他のヒント
古い投稿にもかかわらず、これに答えざるを得ない気がします...私はPHPカールで多くの作業をしてきましたが、WWW:Mechanizeのようなものに匹敵するほど良くありません。 (私はRuby言語の実装を採用するつもりだと思います。)Curlは、あまりにも多くの「不平を言う作業」を必要とするため、時代遅れです。何でも自動化するために、最もシンプルなスクリプト可能なブラウザは私にとっては有望に見えましたが、テストでは、試してみるほとんどのWebフォームでは動作しません...別の言語を見るのがベストです。このトピックに数え切れないほどの時間を費やしているので、これを投稿したかっただけで、将来誰か他の人の時間を節約できるかもしれません。
2016年になり、 Mink があります。ヘッドレスの純粋なPHP「ブラウザ」とは異なるエンジンもサポートしています。 (JavaScriptなし)、Selenium(FirefoxやChromeなどのブラウザーが必要)を介して、ヘッドレスの「browser.js」に移動します。 NPMでは、JavaScriptをサポートしています。
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);
}
}
次のいずれかを試してください:
- PEARの HTTP_Request
- Zend_Http_Client
(はい、それはZendFrameworkコードですが、必要なライブラリをロードするだけなので、クラスの使用を遅くすることはありません。)
スヌーピーを見る: http://sourceforge.net/projects/snoopy/
Curlは、単純なリクエストを処理する方法です。クロスプラットフォームで実行され、PHP拡張機能があり、広く採用され、テストされています。
CurlHandler :: Get($ url、$ data)を呼び出すだけで、データの配列(ファイルを含む!)を取得して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 Curlは、単純なリクエストを処理する方法です。クロスプラットフォームで実行され、PHP拡張機能があり、広く採用され、テストされています。
CurlHandler :: Get($ url、$ data)を呼び出すだけで、データの配列(ファイルを含む!)を取得してURLにPOSTできる素敵なクラスを作成しました|| CurlHandler :: Post($ url、$ data)。オプションのHTTPユーザー認証オプションもあります:)
<*>
[編集]今だけ説明を読んでください...おそらく、上記のものを自動化するツールのいずれかを使用したいでしょう。また、 ChickenFoot などのクライアント側firefox拡張機能を使用することもできます。柔軟性。上の例のクラスは、今後の検索のためにここに残します。
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拡張機能を使用することもできます。柔軟性。上の例のクラスは、今後の検索のためにここに残します。
プロジェクトで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にあるすばらしいスクレイピング/自動化ライブラリがないことに同意する傾向があります。
* nixシステムを使用している場合、shell_exec()をwgetで使用できます。これには多くの素晴らしいオプションがあります。