💻️
スクレイピングとサーバー実行のサンプルコード(PHP)

PHPでスクレイピングとWebサーバーを開発する手順を書いていきます。

開発の手順

環境構築

# プロジェクトのディレクトリ作成
$ mkdir scraping-server
$ cd scraping-server

# composer (PHPのパッケージマネージャー)のインストール
brew install composer

# パッケージのインストール
$ composer init
$ composer require slim/slim:"3.*"
$ composer require guzzlehttp/guzzle
$ composer require paquettg/php-html-parser

インストールしている外部パッケージは以下の3つです。

Webサーバーの起動

まず以下の内容で index.php を作成します。

<?php
require __DIR__ . '/vendor/autoload.php';

$app = new \Slim\App();

$app->get('/', function ($request, $response) {
$response->getBody()->write("test");
return $response;
});

$app->run();

その後、以下コマンドを実行して http://localhost:3000 にブラウザでアクセスすると、”test” の文字が表示されます。

$ php -S localhost:3000 これで、Webサーバーの起動ができました。

スクレイピングで取得した情報を表示する index.php に以下の実装を追加します。

<?php
require __DIR__ . '/vendor/autoload.php';

$app = new \Slim\App();

/* この関数を追加 */
function getItems() {
// プログラミング言語一覧記事を取得
$url = 'https://en.wikipedia.org/wiki/List_of_programming_languages';
$client = new GuzzleHttp\Client();
$res = $client->request('GET', $url);
$html = $res->getBody()->getContents();

// HTMLをパース
$dom = new PHPHtmlParser\Dom;
$dom->loadStr($html);
$itemList = $dom->find('.div-col li');

$items = [];
foreach ($itemList as $item) {
$items[] = $item->innerText();
}

return $items;
}

$app->get('/', function ($request, $response) {
/* 追加した関数を使用する */
$items = getItems();
$response->getBody()->write(json_encode($items));
return $response;
});

$app->run();

追加実装の後、 php -S localhost:3000 を再実行して http://localhost:3000 にアクセスすると、 Wikipediaのページから取得したプログラミング言語一覧の文字が表示されるようになります。

補足 ここまでのコードは外部パッケージを利用して拡張性のある実装にしていました。

しかし、PHPはWeb開発に特化した言語であることもあり、上記の外部パッケージの機能は実はPHP言語そのものにも備わっています。

可読性や拡張性はやや下がってしまいますが、 シンプルなスクレイピングとWebサーバーを手軽に実装する場合は下記のコードでも同じ結果を得ることができます。

<?php

// Webページの取得
$url = 'https://en.wikipedia.org/wiki/List_of_programming_languages';
$html = file_get_contents($url);

// HTMLのパース
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

$finder = new DomXPath($dom);
$nodes = $finder->query("//*/ul/li");

$items = [];
foreach($nodes as $node) {
$items[] = $node->nodeValue;
}

// 結果の表示
echo json_encode($items);

こちらも前回と同様に、実装した後は、 php -S localhost:3000 を再実行して http://localhost:3000 にアクセスすることで結果を確認できます。