facebook twitter hatena line email

Php/Goutte

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

Goutteとは

スクレイピングライブラリです。PHP5.3以降サポート

ベンチマーク

Simple HTML DOM Parserより良いらしい。

参照:http://qiita.com/soarcreator/items/56a971d42b8b640b76a6

使い方

https://github.com/fabpot/goutte

DL

wget https://raw.github.com/fabpot/Goutte/master/goutte.phar

dom操作

filter('h1')   CSSセレクタにマッチするノード
filterXpath('h1')   XPath式にマッチするノード
eq(1)   指定したインデックスのノード
first()   最初のノード
last()   最後のノード
siblings()   兄弟のノード
nextAll()   後の兄弟ノード
previousAll()   前の兄弟ノード
parents()   親ノード
children()   子ノード
reduce($lambda)   callableがfalseを返さないノード
selectLink($value)   指定されたテキストを含むリンクすべてを選択
selectButton($value)   指定されたテキストを含むボタンすべてを選択

filter指定

h1
h1.class1 class指定
h1#id1 id指定
body > p

値取得

attr($attribute)   最初のノードの、指定した属性の値を返す
text()   最初のテキストノードの値を返す
html() 最初のHTMLノードを取得する

サンプル

require_once __DIR__ . '/goutte.phar';
use Goutte\Client;
$client = new Client();
$url = "http://example.com";
$crawler = $client->request('GET', $url);
$dom = $crawler->filter('link');
$dom->each(function($node) {
 // rss取得
 if ($node->attr('type') == "application/rss+xml") {
   echo $node->attr('href')."\n";
 }
});
$dom = $crawler->filter('h1');
$dom->each(function($node) {
   echo $node->text()."\n";
});
$dom = $crawler->filter('a');
$dom->each(function($node) {
 if (preg_match("!http://!", $node->attr('href'))) {
     echo $node->attr('href')."\n";
     echo $node->text()."\n";
 }
});
$dom = $crawler->filter('h2.post > a')
$dom->each(function ($node) {
   print $node->text()."\n";
});
//$dom = $crawler->filter('table.content td');


htmlをhttpでとってこずにsetする場合

use Symfony\Component\DomCrawler\Crawler;
$html = <<<'HTML'
<!DOCTYPE html>
<html>
   <body>
       <p class="message">Hello World!</p>
       <p>Hello Crawler!</p>
   </body>
</html>
HTML;
$crawler = new Crawler($html);

Aタグのリンククリック

$crawler = $client->request('GET', $url);
$targetLinkText = 'もっとみる';
$link = $crawler->selectLink($targetLinkText)->link();
$crawler = $client->click($link);

user_agent偽装

$client->setHeader('User-Agent', 'Googlebot-Video/1.0');
$client->setHeader('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36'); // chrome28

httpリクエストをしないでhtmlだけを解析する方法

use Symfony\Component\DomCrawler\Crawler;
$crawler = new Crawler();
$crawler->addHtmlContent($html, 'utf-8');
$dom = $crawler->filter('img');
if ($dom) {
    $dom->each(function($node) use (&$item) {
      echo $node->attr('src');
    });
}
$dom = $crawler->filter('a');
if ($dom) {
    $dom->each(function($node) use (&$item) {
      echo $node->attr('href');
      echo $node->text();
    });
}

ISO-8859-1以外をhtmlに含めると文字コードをしていないと文字化けするのでaddHtmlContent()の引数に文字コードを指定する

参考:http://docs.symfony.gr.jp/symfony2/components/dom_crawler.html