スクレイピングといえばPythonやRubyを思い浮かべる人も多いが、なんかPHPでもできるらしいのでやってみる。
##今回やってみること
PHPによるWebページのスクレイピング、具体的には、
私のポートフォリオサイトから、貼り付けているリンクを引っ張ってくるというものを作ろうかなと。
スクレイピングとかってサーバーへ与える負担だったり、法律面で規制されていることがあるので、今回は自分のサイトを使うことで他人へ迷惑をかけるリスクをなくしてやる。
$ php -version
PHP 7.3
とは言ってもライブラリが何個かあったのだが、調べて一番上に出てきたPHPQueryはなんか古いらしいので今回はphp-html-parserを使ってみる。
##実際にやってみる
ということでcomposerを使って実行するファイルと同じ階層にインストールする。
$ composer require paquettg/php-html-parser
ここまでできたら外部ファイルの読み込みとクラスの参照及びに実際にコードを書いていく。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PHPHtmlParser\Dom;
$url = 'https://ugkajiwara.com/'; //今回スクレイピングしていくのはこのサイト
$dom = new Dom();
$dom->loadFromUrl($url);
$links = $dom->find('a');
foreach($links as $link){
echo $link->href."<br>";
}
?>
結果
#works
#profile
https://www.instagram.com/ug_ka
https://twitter.com/ijuyarawijak
https://model-seeker.com
https://github.com/ugkajiwara/ModelSeeker
https://futon-no-shinsei.com
https://qiita.com/ugkajiwara
https://github.com/ugkajiwara
https://twitter.com/ijuyarawijak
https://www.instagram.com/ug_ka/
と、こんな感じで情報が取り出せるわけだが、ページ内リンクだったり、urlが被っていたりするので、それらのコードを整理してもう一度出力するプログラムを組んでみる。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PHPHtmlParser\Dom;
$url = 'https://ugkajiwara.com/'; //今回スクレイピングしていくのはこのサイト
$dom = new Dom();
$dom->loadFromUrl($url);
$links = $dom->find('a');
$hrefs = array();
foreach($links as $link){
$href = $link->href; //ここでURLを取ってくる
if(strpos($href,"http") === 0){ //httpが最初に出現する位置が一番最初、つまりhttpで始まるhrefかを識別する。
$hrefs[] = $href;
}
}
$hrefs = array_unique($hrefs); //配列内の被りを消す
foreach($hrefs as $href){
echo $href."<br>";
}
?>
$linksからhrefだけのデータを取り出す方法がわからなかったから少し冗長になってしまったが、この結果が
https://www.instagram.com/ug_ka/
https://twitter.com/ijuyarawijak
https://model-seeker.com
https://github.com/ugkajiwara/ModelSeeker
https://futon-no-shinsei.com
https://qiita.com/ugkajiwara
https://github.com/ugkajiwara
と、こんな感じでうまく取り出せているのがわかる。
こんなんいくらでも応用効くやん世の中便利ぃ!