PHPでスクレイピングをしてみよう

a group of people riding motorcycles down a street PHP

スクレイピングと言えば、Pythonというスタンダードがありますが、PHPでもスクレイピングができます。

ウェブサイトのタイトルや見出しを抽出したい

ネット上にあるサイトのタイトルを抽出する

例として、ハローワークの公式サイトから必要なデータを取得します。

でスクレイピングを行うのに、便利なものがあります。

DOMは、「Document Object Model」といいモデルの一種です。ライブラリとは違うものです。

Javascriptをやっている方は、DOMと聞いてはっとされた方がいるかもしれませんが、

DOMを介することで、HTMLやXMLといったWebの構成要素に対して、文字色やサイズの変更などを自由に操作できます。

<?php
$dom = new DOMDocument(); //DOMオブジェクトを新規に作成する
$html = file_get_contents("https://www.hellowork.mhlw.go.jp/");
//データを抽出したいURLを入力する
$dom->loadHTML($html);
//$htmlに指定したHTMLの内容を$domに取り込む
?>

これで、スクレイピングをする準備ができました。

タイトルを抽出するコード

<html>
<?php
  $dom = new DOMDocument('1.0', 'UTF-8');
  $html = file_get_contents("https://www.hellowork.mhlw.go.jp/");
//データを抽出したいURLを入力
  @$dom->loadHTML($html);
  $xpath = new DOMXpath($dom);
  echo $xpath->query("//title")->item(0)->nodeValue;
//タイトルを抽出して出力
?>
</html>

h2タイトルを抽出するコード

<html>
<?php
  $dom = new DOMDocument('1.0', 'UTF-8');
  $html = file_get_contents("https://www.hellowork.mhlw.go.jp/");
  @$dom->loadHTML($html);
  $xpath = new DOMXpath($dom);

foreach($xpath->query('//h2') as $node){ //h2の部分を変更することで他のタグなど指定が可能
echo "<p>";
echo $node->nodeValue; //h2の内容を1つずつ表示させる
echo "</p>";

 }
?>
</html>

タイトルと見出しが表示しているでしょうか?

人によっては警告(Warning)が出ますが、タイトル、見出しが表示されているはずです。

また、文字コードをUTF-8にしていても、文字化けが起こるようなら、この記事を見てください。

スクレイピングのレベルアップ

さらに高度なスクレイピングをするには、正規表現やデータベースを使う必要があります。

正規表現を使うことによって、きめ細かな条件の下で、より的確なデータを取得できます。

データベースの知識があると、ブラウザ表示だけでなく、データベースまで検索して、より深いデータが取得できます。

の記事を参考にしてください。

スクレイピングを行う上での注意点

ごっそりとってくる機能なので、著作権はもちろんのこと、各サービスの規約を順守する必要があります。

本人が思っている以上に、サーバーに負荷をかけてしまいます。

Google Map Platformのように、データ量の規制もあります。

にほんブログ村 IT技術ブログへ
にほんブログ村

スクレイピング禁止サイトを見分ける方法

規約を見る

利用規約に明示的にスクレイピングを禁止する記載があれば、明らかに禁止されています。

WebAPIが提供されていること

WebAPIを提供している場合、アクセスはWebAPI経由に限られていることが多いです。

robot.txtを見る

コンテンツとともにWebにアップロードされているファイルrobot.txtは、検索エンジンのクローラに対してURLのアクセス可否を記載しています。robot.txtでアクセスが許されていないURLはスクレイピングも禁止されています。

コメント

タイトルとURLをコピーしました