PHPによるウェブスクレイピング: ステップバイステップガイド

シンプルなPHPのウェブスクレイパーをゼロから簡単に作成し、プログラミングする方法を学びます。
1 min read
Web scraping with PHP

PHP(ハイパーテキストプリプロセッサー)は、ウェブデータ収集に利用できるウェブ開発用のスクリプト言語です。本記事では次の内容を取り上げます:

PHPを使う理由

PHPは現在、WordPress、Slack. などのサイトを含め、ウェブサイトの約40%を動かしています。ウェブ開発において最も人気のあるサーバーサイドスクリプト言語の一つです。MySQL を使用している人にとって、両者のデータベースは密接に関連しています。比較的習得しやすい言語であり、ドキュメントやライブラリも充実しているため、開発期間を短縮できます。

PHPの紹介

This guide will introduce a method of manual web scraping in which you send a bot to a web server and collect data using PHP as the foundational programming language. This is as opposed to using a fully automated data collection tool that can simplify and streamline the process.

ウェブスクレイパーは、サーバーにHTTPリクエストを送信し、ウェブサイトのコードを収集することで機能します。以下では、得られた情報をどのように分析するかを紹介します。

以下は、スクレイピングしたいウェブサイトの見出しに表示されるコードスニペットの例です:

<html><body><h1>This is a heading!</h1></body></html>

このコードを取得したら、人間の分析者が読んで理解できるように解析されなければなりません。この例では、パース後に、以下のようなプレーンテキストが残ります:

‘This is a heading!’

始める前に、お使いのコンピュータにPHPがインストールされていることを確認してください。

PHPによるウェブスクレイピングの簡単な3ステップ

手順1:ターゲットWebサイトのコードを収集します。

次のコードを入力して始めます:

<?php
$code = file_get_contents (“http://quotes.toscrape.com”); 
?>

コーディング規約に関して:

  • “<?php” and “?>” are used in all PHP documentation at the beginning and the end of commands. 
  • The second line sets a variable called “$code” that pertains to the contents of the URL in question, in this example, we will be targeting: “http://quotes.toscrape.com”. This helps store the URL code inside of the “$code” variable.

完全自動のウェブスクレイピングソリューションをご希望ですか?

手順2:ウェブページの解析

この作業は、本サイトに掲載されているすべての引用文を収集することを目的としています。

引用サイトでの引用文

目的のページで右クリックし、「ページのソースを表示」をクリックすると、ソースコードが表示された新しいウィンドウが開きます。この例では、すべての引用符がタグの中に入っており、itemprop属性も「text」に設定された “text “クラスで、次のように表示されています。

引用コード例

まず、PHPを利用して、タグの中にある引用符以外の不要なテキストを取り除き、「echo」関数を使って画面に表示することから始めます:

<?php
$code = file_get_contents("http://quotes.toscrape.com");
$code = str_replace(">", "<>", $code);

$splitCode = explode("<", $code);

// Find the first occurance of the opening tag of the quotes: 
$openingTag = array_search('span class="text" itemprop="text"', $splitCode, true);

// Find the first occurance of the closing tag of the quotes 
$closingTag = array_search('/span', $splitCode, true);

// Now, find the text in between the tags 
$i = $openingTag;
$total = "";
while ($i < $closingTag) {
	$total = $total . $splitCode[$i];
	$i = $i + 1;
}
$final = substr($total, 37);
echo $final;
?>

2行目では、コード中の”>”を””に置き換えています。これは、5行目の”タグの位置を、11行目で末尾のタグの位置を検索しています。

あとは、この2つの間にあるテキストを取り出せばいいだけです。そのためには、開始タグ変数の位置の値で「i」という変数を作成します。そして、その結果を後で入力するための変数を作成します。16行目で、開始タグの後の各文字をループし始め、その文字を合計値に加え、変数「i」を増加させています。終了タグを過ぎると、ループは停止します。

次に、最終的な文字列の最初の37桁を削除します。この最初の37桁は、解析対象のタグ、つまりタグの中にある数字であるためです。最後に、「echo関数」を使って最終結果を取得します。

プログラムを実行すると、次のような画面が表示されます:

“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.” 

これは、「非人間的」なコードを一切使わずにスクレイピングしているウェブサイトに表示される最初の引用文です。

手順3:ループスルー

お気づきかもしれませんが、最初の1回しか収集せず、それ以降は一収集しません。これを解決するには、今返したオカレンスを削除して、全部を取得するまでこのプロセスを繰り返します。さらに、スクレイピング処理を関数に落とし込み、必要なときにいつでも実行できるようにすることで、コードを簡素化できます。このコードを利用してみてください:

<?php 
$code = file_get_contents("http://quotes.toscrape.com");
$code = str_replace(">", "<>", $code); 

$splitCode = explode("<", $code);

function parseCode($splitCode) {
	// Find the first occurance of the opening tag of the quotes:
	$openingTag = array_search('span class="text" itemprop="text"', $splitCode, true);
	
	// Find the first occurance of the closing tag of the quotes: 
	$GLOBALS[closingTag] = array_search('/span', $splitCode, true);
	
	// Now, find the text in between the tags 
$i = $openingTag;
$total = "";
while ($i < $GLOBALS["closingTag"]) {
	$total = $total . $splitCode[$i];
	$i = $i + 1;
}
// Run the function, then update splitCode to delete the previous occurance 
// that it can be repeated for the next quote, then loop through 3 times 
// (You can change how many times):
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);

?>

先のコードが「parseCode」という関数に入力され、「$splitCode」というパラメータを含んでいることにお気づきでしょうか。この関数がコードにアクセスし、その結果を「エコー」することができるようになっています。27行目で「parseCode」関数が実行され、28行目で前の閉じタグを削除し、複製できるようにします。27行目と28行目は、プログラムがパターンを識別し、次の出現を発見できるように、単純に3回繰り返されています。

最後に、閉じタグをスーパーグローバルスコープ「$GLOBALS」の「グローバル変数」として入力し、21行目で、返す各行の周りに<p>タグを入力して、解析する新しい引用符ごとに新しい行を作成するようにしています。その結果がこれです:

“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.”

“There are only two ways to live your life. One is as though nothing is a miracle. The Other is as though everything is a miracle.” 

“Try not to become a man of success. Rather become a man of value.”

The result is exactly what we were looking for. No code, just readable text. This process can be replicated for nearly any target site, such as scraping eBay for target data points such as product pricing, reviews, and SKUs (Stock Keeping Units).

キーポイント

PHPを使用して対象データをウェブ上でスクレイピングすることは、時間や手間のかかる作業ではありますが、効果的な方法と言えます。企業が検討すべき現実的な選択肢は、すぐに使えるデータセットの購入です。これにより、時間とリソースを節約し、ご自身やチームは事業の拡大、顧客満足の確保、コア製品の開発に全力を注ぐことができます。

あなたは下記にもご興味がおありかもしれません

Web Scraping with Java Guide_large
各種ご利用方法

Javaを使用したウェブスクレイピングガイド

このチュートリアルでは、Gradleプロジェクトをセットアップし、HtmlUnitの依存関係をインストールする方法を学びます。その過程で、HtmlUnitについて学び、その高度な機能のいくつかを詳しく見ていきます。
3 min read
What is a data parser featured image
ウェブデータ

データ解析とは?定義、利点、および課題

この記事では、データ解析について知っておくべきことをすべて説明します。データ解析とは何か、なぜそれが重要なのか、どのようにアプローチするのが最善かを解説します。
1 min read
What is a web crawler featured image
ウェブデータ

ウェブクローラーとは?

ウェブクローラーは、インターネットのインフラとして重要な部分を担っています。この記事では、以下の事項を説明します。 ウェブクローラーの定義 ウェブクローラーとは、インターネットをスキャンして、見つけたデータをダウンロードするソフトウェアロボットです。大半のウェブクローラーは、Google、Bing、Baidu、DuckDuckGoなどの検索エンジンによって運用されています。検索エンジンは、収集したデータに検索アルゴリズムを適用して、検索エンジンインデックスを作成します。このインデックスにより、検索エンジンはユーザーの検索クエリに基づいて、関連するリンクを提供できます。 過去の特定の時点のウェブサイトのスナップショットを提供するWay Back Machineのように、検索エンジンとは別の目的で使用されるウェブクローラーもあります。   ウェブクローラーの仕組み GoogleのGooglebotのようなウェブクローラーは、毎日、クローリングしたいウェブサイトのリストを作成して作業を開始します。これはクロールバジェットと呼ばれます。バジェットには、ページのインデックス作成に対する需要が反映されます。クロールバジェットに影響する2つの主な要因は、人気と陳腐化です。インターネット上で人気のあるURLは、インデックス内で最新の状態を保つために、より頻繁にクローリングされる傾向があります。また、ウェブクローラーはURLのインデックスが陳腐化するのを防ごうとします。 ウェブクローラーがサイトに接続すると、まずrobots.txtファイルをダウンロードして読み込みます。robots.txtファイルは、ロボットがウェブをクローリングし、コンテンツにアクセスしてインデックスを作成し、そのコンテンツをユーザーに提供する方法を規制するウェブ標準群であるロボット排除プロトコル(REP)の一部です。ウェブサイトの所有者は、サイト上でアクセスできるユーザーエージェントとアクセスできないユーザーエージェントを定義できます。また、robots.txtには、クローラーがウェブサイトに対して行うリクエストのペースを抑制するためのcrawl-delayディレクティブを定義することもできます。また、robots.txtには、サイトに関連するサイトマップも記載されているため、クローラーはすべてのページとその最終更新日時も確認できます。前回のクローラー訪問以降に変更がないページは、今回スキップされます。   ウェブクローラーは、クローリング対象のページに最終的に到達すると、そのページをブラウザーでレンダリングし、すべてのHTML、サードパーティーのコード、JavaScript、CSSを読み込みます。この情報は検索エンジンのデータベースに保存され、後でページのインデックス作成とランク付けに使用されます。また、ページ上のすべてのリンクもダウンロードします。検索エンジンのインデックスにまだ登録されていないリンクは、後でクロールするためのリストに追加されます。 robots.txtファイルに記載されているディレクティブへの準拠は任意です。ほとんどの主要な検索エンジンはrobots.txtディレクティブに従っていますが、そうでないものもあります。スパマーやボットネットなどの悪質業者は、robots.txtディレクティブを無視します。Internet Archiveのような合法的なウェブクローラーでさえ、robots.txtを無視しています。 ウェブクローラーの例 検索エンジンには複数の種類のウェブクローラーがあります。たとえば、Googleには17種類のボットがあります。 SEO対策にウェブクローラーが重要な理由 SEOの目標は、ユーザーが関連する検索語を検索したときに、自社のコンテンツが簡単に見つかるようにすることです。Googleは、コンテンツがクローリングおよびインデックス化されていない場合、コンテンツをどこにランク付けしたらよいかを知ることができません。 ウェブクローラーは、他の分野でも役立つことがあります。Eコマースサイトでは、競合他社のサイトをクローリングして、製品の品揃えや価格を分析することがよくあります。通常、この種のデータ収集は「ウェブクローリングではなくウェブスクレイピング」として知られています。ウェブスクレイピングは、特定のHTMLデータ要素に焦点を当てます。ウェブスクレイパーは非常に集中的であるのに対し、ウェブクローラーは広く網を張ってあらゆるコンテンツを収集します。ユーザーの側には、SERPデータのクローリングやスクレイピングを支援するSERP APIツールもあります。   ウェブクローラーが直面する課題 ウェブクローラーが直面する課題はいくつもあります。 課題 説明 robots.txtの制限 ウェブクローラがrobots.txtの制限に従う場合、特定のウェブページにアクセスできなかったり、任意の制限を超えるリクエストを送信できなかったりすることがあります。 IPの禁止 ウェブクローラーの中には、robots.txtの制限に従わないものもあるため、それらが他のさまざまなツールを実装してウェブクローリングを制限することがあります。ウェブサイトは、詐欺師が使用する無料データプロキシや特定のデータセンターのIPアドレスなど、悪意があることがわかっているIPアドレスを禁止することができます。 ジオロケーションの制限 一部のウェブサイトでは、ウェブサイトコンテンツにアクセスするために、特定の地域に居住していることを条件としています。たとえば、米国以外の地域からNetflix USAのコンテンツにアクセスしようとする場合です。地理的な制限の大半は、レジデンシャルプロキシネットワークを使用することで克服できます。   CAPTCHA 一部のウェブサイトでは、不審なソースからの大量のアクティビティを検出すると、リクエストの背後にいるのが本物の人間かどうかを確認するためにCAPTCHAを表示します。CAPTCHAはウェブクローラーの活動を阻害する可能性があります。多くのウェブスクレイピングソリューションは、この種のブロックを克服するためのツールや技術を備えています。これらのブロック解除ツールは、多くの場合、CAPTCHA解決ソリューションを利用します。   まとめ ウェブクローラーは、インターネットのインフラとして重要な部分を担っています。これにより、検索エンジンは検索インデックスを作成するために必要なデータを収集し、ユーザーのクエリに対して検索結果を提供できます。多くの企業は、調査を支援する役割としてのウェブクローラーに注目しています。実際には、多くの場合、Amazon、Adidas、Airbnbのリスティングのように、1つか2つのサイトに集中しています。このようなユースケースでは、Bright DataのウェブスクレイパーIDEのようなツールが、よりニーズに適しています。  
1 min read

More from Bright Data

Datasets Icon
Get immediately structured data
Access reliable public web data for any use case. The datasets can be downloaded or delivered in a variety of formats. Subscribe to get fresh records of your preferred dataset based on a pre-defined schedule.
Web scraper IDE Icon
Build reliable web scrapers. Fast.
Build scrapers in a cloud environment with code templates and functions that speed up the development. This solution is based on Bright Data’s Web Unlocker and proxy infrastructure making it easy to scale and never get blocked.
Web Unlocker Icon
Implement an automated unlocking solution
Boost the unblocking process with fingerprint management, CAPTCHA-solving, and IP rotation. Any scraper, written in any language, can integrate it via a regular proxy interface.

Ready to get started?