
スクレイピングの本質は、サーバーサイド処理にあります。
他のサイトからデータを取得して、データベースに保存して、再活用するというのは、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の学習をして、より便利なツールに作り上げることも可能です。
0 件のコメント:
コメントを投稿