技術めも

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;
}