▶ 技術めも
PHPでWEBスクレイピング
PHP Simple HTML DOM Parser
マニュアル
http://simplehtmldom.sourceforge.net/manual.htm
DOWNLOAD
https://github.com/sunra/php-simple-html-dom-parser
CSS指定(jQuery DOM指定)ライクに、DOM要素を取得できるスクレイピングライブラリ
Install
"require": {
"sunra/php-simple-html-dom-parser": "1.5.0"
}
use Sunra\PhpSimple\HtmlDomParser;
$dom = HtmlDomParser::str_get_html( $str );
or
$dom = HtmlDomParser::file_get_html( $file_name );
$elems = $dom->find($elem_name);
使い方
- Googleトップページの A要素 のリンク先をすべて表示
<?php
require_once __DIR__.'/HtmlDomParser.php';
// Create DOM from URL or file
$html = HtmlDomParser::file_get_html('http://www.google.com/');
// Find all links
foreach($html->find('a') as $element) {
echo $element->href . '<br>';
}
- GoogleトップページのHTMLを表示
echo HtmlDomParser::file_get_html('http://www.google.com/')->innertext;
- Googleトップページのテキストを表示
echo HtmlDomParser::file_get_html('http://www.google.com/')->plaintext;
- テキストのHTMLを DOMオブジェクト化
$html = HtmlDomParser::str_get_html($htmlBody);
- メモリ不足のエラー対策
$html->clear();
スクレイピング用 文字列切り出し関数
/**
* スクレイピング用 文字列切り出し関数
*
* @param $body 対象文字列
* @param $start 切り出し開始文字列
* @param $end 切り出し終了文字列/切り出し文字数(マイナスで前方切り出し)
* @param $markInclude 開始終了文字列を結果に含めるか
* @param $pattern 切り出し後の正規表現マッチ(nullで未使用)
* @see http://tatenosystem.com/tech_memo_scraping.html
*/
function getContentParts($body, $start, $end = null, $markInclude = false, $pattern = null)
{
if ($pattern !== null) {
preg_match($pattern, $body, $match);
if (empty($match[1])) return '';
return $match[1];
}
$startPos = strpos($body, $start);
if ($startPos === false) return '';
if ($end === null) {
if ($markInclude) {
$body = substr($body, $startPos);
} else {
$body = substr($body, $startPos + strlen($start));
}
return $body;
}
if (is_int($end)) {
if ($end > 0) {
if ($markInclude) {
$body = substr($body, $startPos, $end);
} else {
$body = substr($body, $startPos + strlen($start), $end);
}
} else {
if ($markInclude) {
$body = substr($body, $startPos, -$end);
} else {
$body = substr($body, $startPos + $end, -$end);
}
}
return $body;
}
$endPos = strpos($body, $end, $startPos + strlen($start));
if ($endPos === false) return '';
if ($markInclude) {
$body = substr($body, $startPos, ($endPos - $startPos) + strlen($end));
} else {
$body = substr($body, $startPos + strlen($start), ($endPos - $startPos) - strlen($start));
}
return $body;
}