PHP によるリンクのスクレイピング
by justin、2007 年 8 月 11 日
FROM:http://www.merchantos.com/makebeta/php/scraping-links-with-php/#curl_content
この中でチュートリアルでは、任意の Web ページからリンクを収集する PHP スクリプトを作成する方法を学びます。
学ぶ内容 cURL を使用して Web サイト (URL) からコンテンツを取得する方法。 PHP DOM 関数を呼び出して HTML を解析し、リンクを抽出できるようにします。 XPath を使用して、ページの特定の部分からリンクを取得します。スクレイピングしたリンクを MySQL データベースに保存します。それをすべてリンク スクレーパーにまとめます。スクレーパーを他に使用できるものは何ですか。コンテンツのスクレイピングに関連する法的問題。必要なもの PHP と MySQL の基本的な知識。 PHP 5 を実行している Web サーバー。PHP の cURL 拡張子。 MySQL?リンクを保存したい場合。ページのコンテンツを取得するcURL は、PHP でリモート サーバーにリクエストを行うための優れたツールです。ほぼあらゆる方法でブラウザを模倣できます。ターゲット サイトのコンテンツを取得するコードは次のとおりです:
$ch = curl_init();curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);curl_setopt($ch, CURLOPT_URL,$target_url);curl_setopt($ch, CURLOPT_FAILONERROR, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch, CURLOPT_AUTOREFERER, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);curl_setopt($ch, CURLOPT_TIMEOUT, 10);$html = curl_exec($ch);if (!$html) {echo "<br />cURL error number:" .curl_errno($ch);echo "<br />cURL error:" . curl_error($ch);exit;}
リクエストが成功すると、$html には $target_url のコンテンツが入力されます。呼び出しが失敗した場合は、失敗に関するエラー メッセージが表示されます。
curl_setopt($ch, CURLOPT_URL,$target_url);
この行は、どの URL がリクエストされるかを決定します。たとえば、このサイトをスクレイピングしたい場合は、$target_url = “/makebeta/” となります。設定されている残りのオプションについては説明しません (CURLOPT_USERAGENT を除く ? 以下を参照)。ここで、PHP と cURL に関する詳細なチュートリアルを読むことができます。
ヒント: ユーザー エージェントを偽る間違ったユーザー エージェント文字列を表示すると、多くの Web サイトはうまくいきません。ユーザーエージェント文字列とは何ですか?これは、Web サーバーへのすべてのリクエストの一部であり、どの種類のエージェント (ブラウザ、スパイダーなど) がコンテンツをリクエストしているかをサーバーに伝えます。一部の Web サイトでは、ユーザー エージェントに応じて異なるコンテンツが提供されるため、試してみることをお勧めします。これは、cURL で、オプションとして CURLOPT_USERAGENT を指定して、curl_setopt() を呼び出して実行します。
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
これにより、cURL のユーザー エージェントが Google のユーザー エージェントを模倣するように設定されます。ユーザー エージェントの包括的なリストは、ここで見つけることができます: ユーザー エージェント。
一般的なユーザー エージェント私はあなたのために少し作業を行い、最も一般的なユーザー エージェントを集めました:
検索エンジン ユーザー エージェント Google ? Googlebot/2.1 ( http://www.googlebot.com/bot.html) Google イメージ ? Googlebot-Image/1.0 ( http://www.googlebot.com/bot.html) MSN ライブ ? msnbot-Products/1.0 (+http://search.msn.com/msnbot.htm) Yahoo ? Mozilla/5.0 (互換性; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) ブラウザ ユーザー エージェントに問い合わせます Firefox (WindowsXP) ? Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 IE 7 ? Mozilla/4.0 (互換性; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) IE 6 ? Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) Safari ? Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11 (Gecko のような KHTML) Safari/3.0.2 Opera ? Opera/9.00 (Windows NT 5.1; U; en) PHP の DOM 関数を使用して HTML を解析するPHP は、HTML コンテンツを操作するための非常に優れたツールである DOM 関数を提供します。 DOM 関数を使用すると、HTML (または XML) をオブジェクト構造 (または DOM、ドキュメント オブジェクト モデル) に解析できます。やり方を見てみましょう:
すごいすごい、本当に簡単ですか?はい!これで、HTML 内のあらゆるものにきれいな方法でアクセスするために使用できる、すばらしい DOMDocument オブジェクトができました。私はこれを Russll Beattie の投稿で発見しました:Using PHP TO Scrape Sites As Feeds, thanks Russell!
ヒント: お気付きかもしれませんが、loadHTML() の前に @ を付けています。これにより、HTML パーサーがスローする迷惑な警告が抑制されます。標準に準拠していないコードを含む多くのページ。
XPath を使用すると、必要なリンクを簡単に取得できます。次に、DOM の本当の魔法である XPath について説明します。 XPath を使用すると、DOM ノード (HTML のタグとも呼ばれる) のコレクションを収集できます。順序なしリスト内のリンクのみを取得したいとします。必要なのは、「/html/body//ul//li//a」のようなクエリを作成し、それを XPath->evaluate() に渡すことだけです。 XPath の使用方法をすべて説明するつもりはありません。私は自分自身で学んでいるだけであり、他の人がすでに素晴らしい例のリストを作成しているからです (XPath の例)。これは、XPath を使用してページ上のすべてのリンクを取得するコード スニペットです:
リンクを反復して保存します次に、XPath を使用して収集したすべてのリンクを反復処理し、データベースに保存します。まず、リンクを反復処理するコード:
$dom = new DOMDocument();@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);$hrefs = $xpath->evaluate("/html/body//a");
for ($i = 0; $i < $hrefs->length; $i++) {$href = $hrefs->item($i);$url = $href->getAttribute('href');storeLink($url,$target_url);}
FULL PROGRAM:
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);curl_setopt($ch, CURLOPT_URL,$target_url);curl_setopt($ch, CURLOPT_FAILONERROR, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch, CURLOPT_AUTOREFERER, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);curl_setopt($ch, CURLOPT_TIMEOUT, 10);$html = curl_exec($ch);if (!$html) { echo "
cURL error number:" .curl_errno($ch); echo "
cURL error:" . curl_error($ch); exit;}$dom = new DOMDocument();@$dom->loadHTML($html);$xpath = new DOMXPath($dom);$hrefs = $xpath->evaluate("/html/body//a");for ($i = 0; $i < $hrefs->length; $i++) { $href = $hrefs->item($i); $url = $href->getAttribute('href'); echo $url; echo "
?>
"; }
then you can store url to your database. more details from here:http://www.merchantos.com/makebeta/php/scraping-links-with-php/#curl_content
REF:tutorial on PHP and cURL
You can find a comprehensive list of user agents here: User Agents.
Using PHP TO Scrape Sites As Feeds