最初、curlでHTMLを読込、正規表現でタグの内容を取得しようとしていたがスタイルシートのURLも取得する必要があり、正規表現もめんどうと思い、探してみた。
いろいろなサイトにGoutteでスクレイピングというのがあり、タグの要素などは簡単にとれそうなのでこれを試すことにした。

Goutte

インストールは、composerでインストール。
依存ファイルがあるので、githubからダウンロードしたファイルだけでは動作しない。

 require fabpot/

いくつかのサイトを見たが、スタイルシートのhref属性を取得するようなサンプルはなかったんでメソッド関連を確認し、取得する方法がわかった。
メソッドは、依存関係にあるsymfonyのCrawlerクラスにあります。
/vendor/symfony/dom-crawler/Crawler.

use Goutte\Client;

class Sample1 {

    public function test1()
    {
        try {
            $url = 'https://pg.4696.info/db//sql-.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」ってどう読むんだろうなぁと思い、「グット」とか「ゲット」とか書いてるページがあった。
英語じゃなくフランス語にこの単語があって「グットゥ」と発音するようだ。
フランス語の発音はむずかしいと思う・・・・

カテゴリー: PHP

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です