最初、curlでHTMLを読込、正規表現でタグの内容を取得しようとしていたがスタイルシートのURLも取得する必要があり、正規表現もめんどうと思い、探してみた。
いろいろなサイトにGoutteでスクレイピングというのがあり、タグの要素などは簡単にとれそうなのでこれを試すことにした。
インストールは、composerでインストール。
依存ファイルがあるので、githubからダウンロードしたファイルだけでは動作しない。
composer require fabpot/goutte
いくつかのサイトを見たが、スタイルシートのhref属性を取得するようなサンプルはなかったんでメソッド関連を確認し、取得する方法がわかった。
メソッドは、依存関係にあるsymfonyのCrawlerクラスにあります。
/vendor/symfony/dom-crawler/Crawler.php
use Goutte\Client;
class Sample1 {
public function test1()
{
try {
$url = 'https://pg.4696.info/db/postgresql/sql-with.html';
$client = new Client();
$crawler = $client->request('GET', $url);
// ページタイトルを取得
$page_title = $crawler->filter('head > title')->text();
echo $page_title.'<br>';
// スタイルシートのhref属性を取得
$crawler->filter('head > link')->each(function($node) {
$href = $node->attr('href');
$ext = substr($href, -4);
if ($ext == '.css') {
echo $href.'<br>';
}
});
// id指定でタグを含めて取得
$div_html = $crawler->filter('footer#colophon')->html();
echo htmlspecialchars($div_html).'<br>';
// submitボタンのvalueを取得
// buttonタグならtext()で取得できる
$button = $crawler->filter('input[type=submit]')
->attr('value');
echo $button.'<br>';
} catch (Exception $ex) {
echo 'エラーだよ';
}
}
}
プロキシを使用する場合
$proxy_url = 'http://xxxx.xxx:8080';
$client = new Client();
$client->setClient(new \GuzzleHttp\Client(['proxy' => $proxy_url]));
$crawler = $client->request('GET', $url);
ちなみに、存在しないURLを読み込ませて、タグの内容を取得しようとするとエラーとなるので
try-catchしてます。
URLの読込時点ではエラーとならず、ノードの取得メソッドでエラーとなります。
「Goutte」ってどう読むんだろうなぁと思い、「グット」とか「ゲット」とか書いてるページがあった。
英語じゃなくフランス語にこの単語があって「グットゥ」と発音するようだ。
フランス語の発音はむずかしいと思う・・・・
0件のコメント