3

php guzzle Client を使用して Web サイトを取得し、symfony 2.1 クローラーで処理しています

フォームにアクセスしようとしています....たとえば、このテストフォームは http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htmにあります

$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm';
$client = new Client($url);

$request = $client->get();
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYHOST, false);
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, false);
$response = $request->send();
$body = $response->getBody(true);
$crawler = new Crawler($body);
$filter = $crawler->selectButton('submit')->form();
var_dump($filter);die();

しかし、私は例外を受け取ります:

現在のノード リストは空です。

フォームにアクセスする方法について、私はちょっと迷っています

4

1 に答える 1

7

Goutte を使用してみてください。これは、既に使用しているツール (Guzzle、Symfony2 Crawler) の上に構築されたスクリーン スクレイピングおよび Web クローリング ライブラリです。詳細については、GitHub リポジトリを参照してください。

Goutte を使用すると、コードは次のようになります。

<?php
use Goutte\Client;

$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm';
$client = new Client();

$crawler = $client->request('GET', $url);
$form = $crawler->selectButton('submit')->form();
$crawler = $client->submit($form, array(
    'username' => 'myuser', // assuming you are submitting a login form 
    'password' => 'P@S5'
));
var_dump($crawler->count());
echo $crawler->html();
echo $crawler->text();

本当に CURL オプションを設定する必要がある場合は、次の方法で実行できます。

<?php
$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm';
$client = new Client();
$guzzle = $client->getClient();
$guzzle->setConfig( 
    array(
        'curl.CURLOPT_SSL_VERIFYHOST' => false,
        'curl.CURLOPT_SSL_VERIFYPEER' => false,
    ));
$client->setClient($guzzle);
// ...

アップデート:

DomCrawler を使用すると、同じエラーが発生することがよくあります。ほとんどの場合、ページ内の正しい要素を選択していないか、要素が存在しないことが原因です。使用する代わりに試してください:

$crawler->selectButton('submit')->form();

以下をせよ:

$form = $crawler->filter('#signin_button')->form();

filter メソッドを使用して id で要素を取得している場合、'#signin_button'または class で取得することもできます '.signin_button'。filter メソッドにはCssSelector Componentが必要です。

また、HTML ( echo $crawler->html();) を印刷してフォームをデバッグし、実際に正しいページにいることを確認します。

于 2013-10-04T00:26:31.177 に答える