11

問題
GoutteWebスクレイパーを完全に理解できません。

リクエスト
誰かが私がGoutte Webスクレイパーを使用する方法をよりよく理解するのに役立つコードを理解または提供するのを手伝ってくれませんか?README.mdを読みました。Goutteで利用できるオプションやそれらのオプションの記述方法など、提供される情報よりも多くの情報を探しています。フォームを表示しているときに、フォームのname=またはid=を検索しますか?

スクレイプしようとしているWebページのレイアウト
ステップ1
Webページには、入力するフォームの種類(名前またはライセンス)を選択するためのラジオボタンが付いたフォームがあります。デフォルトでは、[名前]テキストボックスと[状態]ドロップダウンメニューの選択リストがあります。ラジオを選択した場合、名前と名前のテキストボックスが消えてライセンステキストボックスが表示されるjQueryまたはJavaScriptがあります。

ステップ2
フォームを正常に送信すると、複数のリンクがあるページが表示されます。そのうちの2つのうちの1つにアクセスして、必要な情報を取得できます。

ステップ3
リンクが正常にクリックされたら、3番目のページに探しているデータが含まれ、そのデータをphp変数に格納します。

誤った情報の送信:
間違った情報が送信された場合、jQuery/Javascriptは「レコードが見つかりませんでした」というメッセージを返します。提出物と同じページにあります。


推奨される方法は、[ライセンス]ラジオボタンを選択し、ライセンス番号を入力し、州を選択してからフォームを送信することです。私はGoutteに関するたくさんの投稿やブログ、その他の項目を読みましたが、Goutteで利用できるオプション、この情報を見つける方法、または存在する場合はこの情報を使用する方法をどこにも見つけることができません。

4

2 に答える 2

18

見たいドキュメントはSymfony2DomCrawlerです

Goutteは、 Guzzleの上に構築されたクライアントであり、何かを要求/送信するたびにクローラーを返します。

use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://www.symfony-project.org/');

このクローラーを使用すると、ボディ内のすべてのPタグを取得するなどの操作を実行できます。

$nodeValues = $crawler->filter('body > p')->each(function (Crawler $node, $i) {
    return $node->text();
});
print_r($nodeValues);

フォームに記入して送信します。

$form = $crawler->selectButton('sign in')->form(); 
$crawler = $client->submit($form, array(
        'username' => 'username', 
        'password' => 'xxxxxx'
));

selectButton()メソッドは、ボタン(input [type = submit]、input [type = image]、またはbutton)を指定されたテキストと一致させる別のCrawlerを返すCrawlerで使用できます。[ 1 ]

リンクをクリックするか、オプションを設定し、チェックボックスなどを選択します。フォームとリンクのサポートを参照してください。

クローラーからデータを取得するには、htmlまたはtextメソッドを使用します

echo $crawler->html();
echo $crawler->text();
于 2013-10-08T20:35:06.300 に答える
0

多くの試行錯誤の末、痛風よりもはるかに簡単で、十分に文書化された、より良い支援(必要な場合)とはるかに効果的なスクレーパーがあることを発見しました。痛風に問題がある場合は、次のことを試してください。

  1. Simple HTML Dom:http ://simplehtmldom.sourceforge.net/

スクレイプしようとしているページに独自のWebサイトからのリファラーが必要な場合と同じ状況にある場合は、CURLとSimple HTML DOMを組み合わせて使用​​できます。これは、SimpleHTMLDOMに次の機能があるようには見えないためです。リファラーを送信します。リファラーが必要ない場合は、SimpleHTMLDOMを使用してページをスクレイプできます。

$url="http://www.example.com/sub-page-needs-referer/";
$referer="http://www.example.com/";
$html=new simple_html_dom(); // Create a new object for SIMPLE HTML DOM
/** cURL Initialization  **/
$ch = curl_init($url);

/** Set the cURL options **/
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER,$referer);
$output = curl_exec($ch);

if($output === FALSE) {
  echo "cURL Error: ".curl_error($ch); // do something here if we couldn't scrape the page
}
else {
  $info = curl_getinfo($ch);
  echo "Took ".$info['total_time']." seconds for url: ".$info['url'];
  $html->load($output); // Transfer CURL to SIMPLE HTML DOM
}

/** Free up cURL **/
curl_close($ch);

// Do something with SIMPLE HTML DOM.  It is well documented and very easy to use.  They have a lot of examples.
于 2013-03-29T01:08:04.800 に答える