【PHP】正規表現マッチによる基本的なスクレイピング

preg_match_all()を用いた正規表現マッチによるスクレイピングの実例をサンプルコードと共にご紹介します。

今回スクレイピングを行うのは、Didsoftが運営する Free Proxy Listです。

ターゲット

下画像の赤枠以下のテーブルデータ、全300行を取得します。

コード

<?php
$link = 'https://free-proxy-list.net/';

$agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36';

$ch = curl_init($link);

curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response_data = curl_exec($ch);

if (curl_errno($ch) > 0)
	die('エラー curl: ' . curl_error($ch));

curl_close($ch);

// テーブルを取得。
preg_match("/<table.*?>.*?<\/[\s]*table>/s", $response_data, $table_html);

// 見出しを取得。
preg_match_all("/<th.*?>(.*?)<\/[\s]*th>/", $table_html[0], $matches);
$row_headers = $matches[1];
$row_headers[0] = str_replace("<tr><th>", "", $row_headers[0]);

// 行毎にテーブルデータを取得。
preg_match_all("/<tr.*?>(.*?)<\/[\s]*tr>/s", $table_html[0], $matches);

foreach ($matches[1] as $row_html) {

	// セル毎にテーブルデータを取得。
	preg_match_all("/<td.*?>(.*?)<\/[\s]*td>/", $row_html, $td_matches);
	$row = array();

	// 整形して配列に取得。
	foreach ($td_matches[1] as $keys => $row_td) {
		$td = strip_tags(html_entity_decode($row_td));
		$row[$row_headers[$keys]] = $td;
	}

	if (count($row) > 0)
		$table[] = $row;
}

echo var_dump($table);
?>

実行すると下のようなデータを得られます。

あとはお好きに加工するなりデータベースに入れるなりしてください。