Goutte(PHP7)を使ってみる

はじめに

#001でGoutteをインストール出来たので早速、簡単なサンプルを動かして見ましょう。

html情報の取得

手始めにWikipediaのページをスクレイピングしてみましょう。
以下のようにすればそのページのhtml情報は取ってこれます。

 

 

request()でHTTPリクエストして,html()でHTMLを取得すると行った内容です。ちなみにここでtext()を使うとhtmlタグが抜けたテキストがとれます。

requestする際の注意点

日本語.jpなどのマルチバイト ドメイン名(IDN)を含む URL は、そのままでは GET(名前解決)に失敗します。事前に Punycode(ピュニコード)へのエンコードが必要です。ついでなので、よさげなエンコード / デコード ライブラリもご紹介します。

 

Punycode – Wikipedia

 

GitHub – true/php-punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) for PHP

データの一部分を抜き出してみましょう

いよいよ本題です。Goutte の HTML パーサー部分は Symfony の DomCrawler コンポーネントです。クライアント リクエストの戻り値として取得したオブジェクトを操作してページ内のデータを抜き出す(スクレイピング)しくみです。

DOM 要素のテキストを取得

CSS セレクタ形式の filter() メソッドと、XPath 形式の filterXPath() メソッドが使えます。尚、filterXPath() は、以下のように「descendant-or-self::」から始めた方が無難なようです。

 

リクエストやスクレイピングのエラー処理

ページをリクエストする($client->request)ときやスクレイピングする(filter, filterXPath)ときなどにエラーが発生した場合、各コンポーネントから例外(exception)がスローされます。try ~ catch で適宜、処理する必要があるでしょう。

 

【注意】存在しないセレクタを指定すると停止します

Goutteは存在しない要素をセレクタで指定した場合、エラーを吐いて動作を停止する仕様です。下記のようにcountで必ず要素の有無を確認するようにしましょう。特に長時間かけて大量のページを移動する場合、途中で停止すると再開するのも都度手間がかかります。

要素の存在をチェック

 

私の場合、Crawlerオブジェクトから情報を取得する前提ならば下記で対応してます。

(要素が存在しなければnullを代入)

 

画像をダウンロードしてサーバーの特定のディレクトリに保存する

お馴染みfile_get_contentsを使えば画像を保存できます。

 

フォームを送信する

$loginParamsに送信内容を格納し、リクエスト時に投げる方法のサンプルです。

POST

GET

 

※フォーム送信についての注意点は#003で解説します。

 

【Goutte(PHP7)】フォーム送信に必要なデータを調べる方法 #003
【Goutte(PHP7)】フォーム送信に必要な情報を調べる方法 #003
2018-04-17 17:46
はじめに まず、このページの趣旨はGoutteでのフォーム送信のやり方の説明ではなく、フォーム送信時に必要な送信情報を漏れなく洗い出すため方法です。 ※Goutteを使った基本的な...

セレクタを覚えよう

GoutteはCSS、jqueryライクにセレクタが書けるのも魅力の一つです。すべてのバリエーションを覚える必要はありませんが頭の片隅には入れておきましょう。様々なサイトのスクレイピングを続けているとhtmlの構造が古かったり、コード上でスクレイピング対策が施されている場合等、少し工夫しないと取得できない値に出会うと思います。そのようにセレクタの指定の仕方でつまづいた時、助けになるので目は通しておきましょう。

 

CSSのセレクタとほぼ変わらないのでこちらを参考に

CSS3のセレクタ全42種 まとめておさらい使い方リファレンス

 

Goutte(PHP7)でスクレイピングする【完全マニュアル】

Goutte使い方
Goutte(PHP7)でスクレイピングする【完全マニュアル】
2018-04-16 17:55
はじめに ウェブサイトから情報を取得する場合、RSSやウェブサービスなどのAPIが用意されていればそれらを使うのが一般的ですが、もしサービス側でAPI等が用意されていない場合、どの...

  • Nokogiri(Ruby)のインストール方法 #001
  • 要素数の変化に対応したスクレイピング技法
    要素数の変化に対応したスクレイピング技法 〜 table要素編 〜
  • 【Goutte(PHP7)】フォーム送信に必要なデータを調べる方法 #003
    【Goutte(PHP7)】フォーム送信に必要な情報を調べる方法 #003
  • Goutte(PHP7)を使ってみる
    Goutte(PHP7)を使ってみる #002
  • Goutte(PHP7)のインストール方法
    Goutte(PHP7)のインストール方法 #001
  • Goutte使い方
    Goutte(PHP7)でスクレイピングする【完全マニュアル】
Webクローラー、スクレイピングに関してお困りではありませんか?

DIGは他者に断られるような高度なサイト構造&セキュリティ(SPA、IP分散、画像や文字認証の突破)に対しての対策を最も得意としています。

「このサイトはクローリング、自動操作が可能か」等のご相談から技術的なご質問までクローリング、自動化に関してはどんな内容でも構いません。お気軽にお問い合わせください。

 

お問い合わせ
2018-02-17 18:43
下記フォームにご入力の上、送信ボタンを押してください ※【送信】をクリックすることで、弊社のプライバシーポリシーに同意、読んだものとします。...

 






おすすめの記事
DIGについて
下記フォームにご入力の上、送信ボタンを押してください ※【送信】をクリックすることで、弊社のプライバシーポリシーに同意、読んだものとします。...
サーバー上でiMacrosを動かしたい
ブラウザを自動操作したい
まずはじめに #001〜#006ではiMacrosの基本的な使い方やちょっとした応用技について説明しました。ある程度、iMacrosに慣れて...