Webサイトで使えるクローリング・スクレイピング技術学習 #05 「サーバーサイド処理 (PHP編)」

2025/08/19

PHP テクノロジー 学習

t f B! P L
eyecatch スクレイピングの本質は、サーバーサイド処理にあります。 他のサイトからデータを取得して、データベースに保存して、再活用するというのは、Google検索のそのままのスキームです。 普段仕事でインターネット検索を行う場合に、いろいろなサイトから情報を取得するという行為は、ほとんどの企業で行われている当たり前の操作です。 そんな時に、クローリング、スクレイピングは、非常に有効な手段です。 これまでは、Javascriptと、GoogleAppsScriptを使った比較的手軽にできるスクレイピング処理を行いましたが、 今回は、PHPを使った処理を解説して、学習を進めていきたいと思います。

Dockerで環境構築

サーバーサイドは、サーバーのセッティングが必要になりますが、 ローカルでのセットは、Dockerを使うのがオススメです。 Windows、Mac、Linuxで、どれも同じ環境にする事ができるので、環境によるトラブルが起きにくいのも良い点です。

Docker Desktopのインストール

Windows、Macの場合は、「Docker Desktop」をインストールすれば、Dockerがすぐに使えるようになります。 ダウンロード : Docker Desktop

Githubから以下のリポジトリを取得

https://github.com/yugeta/docker_php ※Gitが扱えない人は、githubサイトのファイルをそのままダウンロードしてもらって、任意のフォルダに構築してもらえれば大丈夫です。

Docker起動

ローカルのターミナルを開いて、上記フォルダの場所でDockerコマンドを実行すると、PHP環境が立ち上がります。 docker compose up -d http://localhost/ ブラウザに上記のURLで、index.phpにアクセスする事ができます。

PHPで、HTML取得処理

これまで作ったプログラムに以下のファイルを追加します。

get_html.php (追加)

<?php $url = $_GET["url"]; $html = file_get_contents($_GET["url"]); $data = [ "url" => $_GET["url"], "html" => file_get_contents($_GET["url"]), ]; echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

get_html.js (変更)

export class GetHtml{ gas_deploy_id = `AKfycbz2t8hLsEELqeZzbtQzjRW8IZVAP_MmSoaUFKsAT0sFKPjhFDXF42L2wdX-Z8-i3RZxcQ` target_url = "https://news.yahoo.co.jp/" constructor(){ this.promise = new Promise((resolve, reject) => { this.resolve = resolve this.reject = reject this.load() }) this.then = this.promise.then.bind(this.promise) } load(){ const url = `get_html.php?url=${encodeURI(this.target_url)}` fetch(url) .then(e => e.text()) .then(this.loaded.bind(this)) } loaded(e){ const data = JSON.parse(e) const doc = new DOMParser().parseFromString(data.html, "text/html") this.finish({ title : this.get_title(doc), lists : this.get_news_lists(doc), }) } get_title(doc){ return doc.querySelector("title").textContent } get_news_lists(doc){ const lists = doc.querySelectorAll(`#contentsWrap .sc-1d6xg0e-3 > div > ul > li > a`) return lists && lists.length ? Array.from(lists).map(e => e.textContent) : null } finish(data){ this.resolve(data) } } ※黄色い文字の部分のみ書き換えます。 これだけで、以前よりも少しスピードが早くスクレイピング結果が得られたと思います。

あとがき

GoogleAppsScriptでの、クローリング(HTML取得)処理を、PHPに書き換えただけなのですが、 PHPにする事で、スピードアップになったり、いろいろな事ができる幅も広がったので、 PHPの学習をして、より便利なツールに作り上げることも可能です。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ