PHPで始めるスクレイピング | webデータの取得と解析

by

in

インターネットは、膨大な情報の宝庫です。膨大だからこそ、その情報を手動で収集し、解析するのは非常に労力がかかります。

ここで登場するのが「スクレイピング」です。

スクレイピングは、自動化されたプログラムを使ってウェブページからデータを収集し、解析するプロセスです。そして、そのプログラムを構築する事がPHPに出来ます。

今回の記事では、「PHPで始めるスクレイピング」と題して、webスクレイピングの世界への一歩を踏み出すための基本から応用までの情報を提供します。

以下のことがわかるようになります。

  • PHPを使ってwebページからデータを取得する方法
  • 取得したデータを解析し、必要な情報を抽出する方法
  • スクレイピングの際に遵守すべきエチケットと法的注意事項

webスクレイピングは、情報収集、競合分析、SEO向上、ビジネスインテリジェンス、研究など、さまざまな用途に役立ちます。

このガイドを通じて、PHPを駆使してwebデータを取得し、解析するスキルを習得し、新たな可能性を探求してみてください。

DOMDocumentを用いたスクレイピング

PHPのDOMDocumentを使用すると、HTMLの要素を効率的に取得できます。

<?php
// DOMDocumentを使用してWebスクレイピングする例

$url = 'https://example.com';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
libxml_use_internal_errors(false);

$links = $dom->getElementsByTagName('a');
if ($links->length > 0) {
    echo "抽出したリンク:\n";
    foreach ($links as $link) {
        $href = $link->getAttribute('href');
        echo $href . "\n";
    }
} else {
    echo "リンクは見つかりませんでした。\n";
}

このコードでは、DOMDocumentを使用してHTMLコンテンツをパースし、aタグを取得してリンクを抽出しています。

DOMDocumentを使用すると、HTMLの構造をより正確に操作でき、スクレイピングの柔軟性が向上するためオススメな方法です。

JavaScriptの経験がある方であればDOM操作の理解が早いかと思われます。

DOMを使用して収集は可能ですが、より簡単に要素を探し出すためにブラウザ上からXpathをコピーして取得する方法もあります

        $xpath = new DOMXPath($dom);
        $links = $xpath->query('//a');

この手法は、HTML構造が明確な場合に有効であり、XPathを利用することで柔軟なデータ抽出が可能になります。

ライブラリの紹介と使用例

その他、PHPでスクレイピングを行う際に便利なライブラリは様々なものがあります。以下にご紹介します。

phpQuery: jQueryのような操作感でHTMLを解析・取得できる。

phpQueryはjQueryのような操作感でHTMLを解析・取得できるため、シンプルなコードで要素の取得が可能です。例えば、特定の見出しを抽出する際には、ファイルの読み込み後にphpQueryのメソッドを用いて容易に取得できます。

require 'phpQuery.php';
$html = file_get_contents('https://example.com');
$doc = phpQuery::newDocument($html);
echo $doc->find('h1')->text();

Symfony BrowserKit: Symfonyコンポーネントを利用したスクレイピングライブラリ。

Symfony BrowserKitは、以前のGoutteライブラリに代わるもので、HTTPリクエストの送信とレスポンスの解析を簡単に行うことができます。フォーム送信やクッキーの管理が必要なケースでは特に便利です。

require 'vendor/autoload.php';

use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;

$browser = new HttpBrowser(HttpClient::create());
$crawler = $browser->request('GET', 'https://example.com');

// ページのタイトルを取得
$title = $crawler->filter('title')->text();
echo "ページタイトル: " . $title . "\n";

// 特定の要素を取得
$crawler->filter('h2')->each(function ($node) {
    echo "見出し: " . $node->text() . "\n";
});

Simple HTML DOM Parser: 簡単にHTML解析ができるライブラリ。

Simple HTML DOM Parserは、HTML構造の解析を直感的に行えるライブラリであり、XPathやCSSセレクタを駆使して特定の情報を抜き出すことができます。軽量で手軽に導入できる点が魅力です。

include('simple_html_dom.php');
$html = file_get_html('https://example.com');
echo $html->find('h1', 0)->plaintext;

JavaScriptで表示されるページのスクレイピングは苦手

webページによっては快適なUIの実装のためにSPA (Single Page Application)と呼ばれる、単一のページでJavaScriptを使用することでコンテンツの切り替えを行うwebアプリケーションが存在しており、JavaScriptを実行させないと表示されないコンテンツが存在します。

PHPによるスクレイピングは前述の方法で可能なのですが、JavaScriptを使用したコンテンツ表示を行っているwebページはスクレイピングする事ができません。

Node.jsを使って回避する

解決方法としてはPHP以外の言語を使用する必要があります。

中でもNode.jsを使用したpuppeteerライブラリを使った実装方法があります。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  
  // ページ上のデータをスクレイピングする処理をここに追加
  
  await browser.close();
})();

Node.jsとpuppeteerを使用したスクレイピングについてはこちらの記事で取り扱っています。

厳密にはPHPでもSeleniumを使用することでJavaScriptページのスクレイピングは可能なのですが、手間を考えるとNode.jsを使用した方が楽に構築できると個人的には思います。

PHPと他言語との比較

スクレイピングを行う際には、PHP以外の言語も選択肢に挙がります。特にPythonはスクレイピングに適した言語として知られています。

PythonのBeautifulSoupを使用すると、HTML解析が容易になります。

from bs4 import BeautifulSoup
import requests

response = requests.get('https://example.com')
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.find('h1').text)

また、JavaScript(Node.js)を活用すると、動的なWebページのスクレイピングが可能になります。

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');
    const content = await page.content();
    console.log(content);
    await browser.close();
})();

PHPでもcURLを使用することで、HTTPリクエストを送信し、Webページの内容を取得することができます。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

PHPはサーバーサイドの言語としてバックエンドに適しており、スクレイピング結果をデータベースに保存する用途に向いています。一方で、Pythonはデータ解析や機械学習との相性が良く、Node.jsは非同期処理を活用して高速なデータ収集を行うのに適しています。

実践的な活用例

ここではPHPスクレイピングを使えるようになった場合、実践的に活用できる例をあげていきます。

  • 価格情報の収集
    ECサイトの価格情報を取得し、商品ごとの価格推移を分析して価格比較サイトを作成する。また、特定の商品がセールになった際に通知を送る仕組みを構築することも可能。
  • ニュース記事の収集
    各種ニュースサイトから最新の記事を自動収集し、特定のキーワードやジャンルに基づいて整理し、キュレーションメディアを運営する。また、記事のタイトルや内容のトレンド分析を行い、関心の高い話題を特定することもできる。
  • 求人情報の収集
    企業の採用ページや求人サイトから最新の求人情報を収集し、求職者向けにまとめた情報を提供する。さらに、特定のスキルや勤務地にマッチした求人をユーザーに通知するシステムの構築も可能。
  • 株価データの収集
    証券会社のサイトや金融ニュースから株価データを取得し、リアルタイムでの分析やチャート表示を行う。特定の条件を満たした際にアラートを送信する仕組みも実装可能。
  • SNSデータの収集
    SNSの公開情報を収集し、特定のハッシュタグやキーワードに関連する投稿を分析する。ブランドの評価を測定したり、話題のトピックを可視化することができる。

エラー処理と例外対応

スクレイピングを行う際には、予期しないエラーが発生することがあります。特にHTTPエラーは頻繁に遭遇する問題の一つであり、ページが存在しない場合やアクセスが拒否された場合には適切な対処が必要です。PHPでは、HTTPリクエストのステータスコードを確認し、異常が発生した場合には適切なエラーハンドリングを行うことが推奨されます。

例えば、file_get_contentsを使用する場合、エラーをキャッチして適切に処理することが重要です。

$context = stream_context_create(['http' => ['ignore_errors' => true]]);
$html = file_get_contents('https://example.com', false, $context);
if ($html === false) {
    echo "データの取得に失敗しました。";
} else {
    echo "ページのデータを取得しました。";
}

また、cURLを用いることで、HTTPステータスコードの確認やエラーハンドリングをより詳細に実装できます。

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
    echo "エラー: HTTPステータスコード $httpCode";
} else {
    echo "データ取得成功";
}

さらに、スクレイピングの実行中にタイムアウトが発生するケースもあります。特に、アクセス先のサーバーが遅延している場合や、ネットワーク環境が不安定な場合には、適切なタイムアウト値を設定して処理の遅延を防ぐことが推奨されます。

ini_set('default_socket_timeout', 10);

また、cURLを利用する場合も、以下のようにタイムアウトを設定できます。

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

スクレイピング対象のWebページが変更されることで、取得したいデータが正しく取得できなくなる可能性もあります。この問題を回避するためには、XPathやCSSセレクタを利用し、構造の変化に強いコードを書くことが重要です。

例えば、DOMDocumentを使用した場合、取得する要素が変更されても対応できるようにするために、柔軟な要素検索を実装します。

$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$titles = $xpath->query('//h1');
foreach ($titles as $title) {
    echo $title->nodeValue . "
";
}

また、定期的にデータの取得結果を検証し、ページ構造が変更されていないかを確認することで、スムーズな運用を維持できます。これらのエラー処理を適切に行うことで、PHPを用いたスクレイピングをより安定して運用できるようになります。

スクレイピングの注意点

webスクレイピングは非常に有用な方法ですが、注意すべき法的および倫理的な問題があります。以下は、スクレイピングを行う際に注意すべき重要な事項です。

  1. webサイトの利用規約を確認
    • webサイトは、スクレイピングを明示的に禁止することがあるため、最初にウェブサイトの利用規約を確認しましょう。利用規約に違反するスクレイピングは法的な問題を引き起こす可能性があります。
  2. robots.txtを尊重
    • webサイトのrobots.txtファイルに記載された指示に従いましょう。このファイルには、クローラーやスクレイパーがアクセスすべきでないページやディレクトリが記述されています。
  3. 過度なリクエストを避ける
    • サーバーに過度なリクエストを送信しないように注意しましょう。過度なトラフィックはwebサイトに負荷をかけ、サービスを妨げることがあります。適切なクローリング速度を設定しましょう。
  4. 個人情報の取得に注意
    • ユーザーの個人情報を収集しないようにしましょう。個人情報の収集や悪用はプライバシー違反となり、法的な問題を引き起こす可能性があります。
  5. アクセス制限の回避を避ける
    • webサイトがアクセス制限やCAPTCHAを導入している場合、それを回避する方法を使用しないようにしましょう。これは法的な問題となることがあります。
  6. 公開情報に限定
    • スクレイピングで収集する情報は、公開された情報に限定しましょう。パスワードで保護されたページや非公開のデータを公開する事は違法になる可能性が高いです。

スクレイピングを行う際には、合法的で倫理的な方法で行動し、他のユーザーやwebサイトに対して配慮を持つことが重要です。

違法なスクレイピングは法的な問題を引き起こし、信頼性を損なう可能性があるため、慎重に行動しましょう。

最後に

以上、PHPでスクレイピングをする方法でした。

処理自体はさほど難しくはないのですが、法律や倫理的な問題が関わってくることを十分に注意しながら実装をしてください。

今回も、お疲れ様でした。

レンタルサーバーを最大限使いこなすための方法

Laravelの記事を厳選して紹介

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA