このチュートリアルでは、Googleの「関連する質問」セクションをスクレイピングするPythonスクリプトの作成方法を学習します。「関連する質問」には、検索クエリに関するよくある質問や貴重な情報が含まれています。
さっそく始めましょう!
Googleの「関連する質問」機能について
「関連する質問」(PAA)はGoogle SERP(検索エンジンの結果ページ)のセクションで、検索クエリに関連する質問の最新リストが掲載されています。
このセクションは、検索クエリに関連するトピックを深掘りするのに役立ちます。2015年頃に初めて導入されたPAAは、展開可能な一連の質問として検索結果に表示されます。質問をクリックすると展開され、関連するWebページからの簡単な回答と、ソースへのリンクが表示されます。
「関連する質問」セクションはユーザーの検索に基づいて頻繁に更新・調整され、最新かつ関連性の高い情報を提供しています。ドロップダウンを開くたびに、新しい質問が新たに読み込まれます。
Googleの「関連する質問」をスクレイピングする:手順ガイド
このガイドに従って、Google SERPから「関連する質問」をスクレイピングするPythonスクリプトの作成方法を学びましょう。
最終目標は、ページの「関連する質問」セクションの各質問に含まれるデータを取得することです。Googleのスクレイピングに興味がある場合は、SERPスクレイピングに関するチュートリアルに従ってください。
ステップ1:プロジェクトを準備する
始める前に、マシンにPython 3がインストールされていることを確認します。インストールされていない場合は、Python 3をダウンロードして実行し、インストールウィザードの指示に従います。
次に、仮想環境を使ってPythonプロジェクトのイニシャライズを行うために、以下のコマンドを使用します。
people-also-ask-scraper
ディクショナリは、Python PAAスクレイパーのプロジェクトフォルダを表しています。
お好みのPython IDEにプロジェクトフォルダを読み込みます。PyCharm Community Editionか、Python拡張機能を入れたVisual Studio Codeがおすすめです。
プロジェクトフォルダにscraper.py
ファイルを作成します。これは現在、空白のスクリプトですが、まもなくスクレイピングのロジックが組み込まれます。
IDEのターミナルで、仮想環境を有効にします。LinuxまたはmacOSでは、次のコマンドを実行してください。
Windowsでは以下を実行してください。
これでスクレイパー向けのPython環境が整いました!
ステップ2:Seleniumをインストールする
Googleはユーザーの操作を必要とするプラットフォームです。また、有効なGoogle検索URLを作成することは容易ではありません。したがって、検索エンジンと連携するにはブラウザ内で作業するのが一番です。
言い換えれば、「関連する質問」セクションをスクレイピングするには、ブラウザ自動化ツールが必要です。この概念に馴染みがない方のために説明すると、ブラウザ自動化ツールは、制御可能なブラウザ内でWebページのレンダリングと操作を可能にするものです。Pythonで最高のオプションの1つはSeleniumです!
アクティブなPython仮想環境で以下のコマンドを実行してSeleniumをインストールします。
selenium
pipパッケージがプロジェクトの依存関係に追加されます。これには時間がかかる場合があるので、しばらくお待ちください。
このツールの使用方法の詳細については、SeleniumでのWebスクレイピングに関するガイドをご覧ください。
素晴らしい、これでGoogleのページをスクレイピングする準備が整いました!
ステップ3:Googleホームページに移動する
Seleniumをscraper.py
にインポートし、Chromeインスタンスをヘッドレスモードで制御するためにWebDriver
オブジェクトを初期化します。
上記のコードは、Chromeウィンドウをプログラムで制御するためのオブジェクトであるChrome WebDriver
インスタンスを作成します。--headless
オプションは、Chromeがヘッドレスモードで実行されるように設定します。デバッグ目的で、その行にコメントを付けて、自動化されたスクリプトの動作をリアルタイムで観察できるようにします。
次に、get()
メソッドを使用してGoogleホームページに接続します。
スクリプトの最後に忘れずにドライバリソースを解放してください。
すべてをまとめると、次のようになります。
素晴らしい、これで動的Webサイトをスクレイピングする準備ができました!
ステップ 4:GDPR(一般データ保護規則)クッキーダイアログへの対処
注:EU(欧州連合)圏内にお住まいでない方は、このステップをスキップできます。
scraper.py
スクリプトをヘッドモードで実行します。これにより、quit()
コマンドがChromeブラウザウィンドウを閉じる前に、Googleページを表示するChromeブラウザウィンドウが一時的に開きます。EU圏内にお住まいの場合は、次のように表示されます。
「Chromeは自動テストソフトウェアにより制御されています」というメッセージは、ChromeがSeleniumによって想定通りに制御されていることを確認するものです。
EU圏内のユーザーにはGDPRに基づくクッキーポリシーダイアログが表示されます。これに該当する場合、そのページを操作したいのであれば、この状況に対処する必要があります。該当しない場合は、ステップ5に進んでください。
Googleページをシークレットモードで開き、GDPRクッキーダイアログを確認してください。それを右クリックし、「検証」オプションを選択します。
ダイアログのHTML要素は次の方法で検索できます。
find_element()
は、さまざまな方法でページ上のHTML要素を検索するためにSeleniumが提供しているメソッドです。このケースではCSSセレクターを使用しました。
次のようにBy
をインポートすることをお忘れなく。
次に、「すべて承認」ボタンを見てみましょう。
ご覧の通り、CSSクラスがランダムに生成されているように見えるため、それを簡単に選択する方法はありません。そのため、そのコンテンツを対象とするXPath式を使用して取得できます。
この指示により、ダイアログ内の最初のボタンで、テキストに「Accept」という文字列が含まれているものが特定されます。詳細については、XPathとCSSセレクターに関するガイドをご覧ください。
以下は、オプションのGoogleクッキーダイアログを処理するにあたり、すべての要素がどう連携しているかを示しています。
click()
命令により、「すべて承認」ボタンがクリックされてダイアログが閉じられ、ユーザーとの対話が許可されます。クッキーポリシーのダイアログボックスが表示されない場合は、代わりにNoSuchElementException
がスローされます。スクリプトはそれをキャッチして続行します。
NoSuchElementException
を忘れずにインポートしてください。
お疲れ様です!「関連する質問」セクションのあるページにアクセスする準備ができました。
ステップ5:検索フォームを送信する
ブラウザでGoogleホームページにアクセスし、検索フォームを確認します。それを右クリックし、「検証」オプションを選択します。
この要素にはCSSクラスはありませんが、そのaction
属性から選択できます。
ステップ4をスキップした場合は、を使用してBy
をインポートします。
フォームのHTMLコードを展開して検索テキストエリアを確認します。
このノードのCSSクラスはランダムに生成されたようです。したがって、そのaria-label
属性から選択します。次に、send_keys()
メソッドを使用してターゲット検索クエリを入力します。
この例では、検索クエリは「Bright Data」ですが、それ以外の検索でも問題ありません。
フォームを送信してページを更新します。
素晴らしい!これで、制御されたブラウザが「関連する質問」セクションを含むGoogleページにリダイレクトされます。
スクリプトをヘッドモードで実行すると、ブラウザが閉じる前に次のように表示されるはずです。
上のスクリーンショットの下部にある「関連する質問」セクションに注目してください。
ステップ6:「関連する質問」ノードを選択する
「関連する質問」のHTML要素を検証します。
繰り返しになりますが、簡単に選択する方法はありません。今回すべきことは、「関連する質問」テキストを持つrole=heading
を含むdiv
要素を含んだjscontroller
、jsname
、jsaction
属性がある
要素を取得することです。
WebDriverWait
は特別なSeleniumクラスで、ページ上で特定の条件が満たされるまでスクリプトを一時停止します。上の例では、目的のHTML要素が表示されるまで最大5秒待機します。これは、フォームの送信後にページを完全に読み込むために必要です。
presence_of_element_locted()
内で使われているXPath式は複雑ですが、「関連する質問」要素を選択するのに必要な基準を正確に記述しています。
必要なインポートを忘れずに追加してください。
いよいよGoogleの「関連する質問」セクションからデータをスクレイピングします!
ステップ7:「関連する質問」をスクレイピングする
まずは、スクレイピングしたデータを保存するためのデータ構造を定義します。
「関連する質問」セクションにはいくつかの質問が含まれているため、これは配列である必要があります。
では、「関連する質問」ノードの最初の質問ドロップダウンを見てみましょう。
ここでは、jsname
属性のみを持つ「関連する質問」要素内のdata-sgrd=”true”
の子要素が注目すべき要素であることがわかります。最後の2つの子要素はGoogleによってプレースホルダーとして使用され、ドロップダウンを開くと動的に入力されます。
次のロジックで質問ドロップダウンを選択します。
要素をクリックして展開します。
次に、質問要素内のコンテンツを見てみましょう。
質問はaria-expanded=”true”
ノード内のタグ内に含まれていることに注意してください。以下のようにスクレイピングします。
次に、回答要素を検証します。
data-attrid=“wa:/description”
要素内のlang
属性を持つノードでテキストを収集して、それの取得方法を確認してください。
次に、回答ボックスにあるオプション画像を検証します。
data-ilt
属性を持つ
要素からsrc
属性にアクセスして、そのURLを取得できます。
画像要素はオプションなので、上記のコードをtry...except
ブロックで囲む必要があります。ノードが現在の質問に存在しない場合、find_element()
はNoSuchElementException
を発生させます。コードはそれを検知して次に進みます。その場合は、
ステップ4をスキップした場合は、例外をインポートします。
最後に、ソースセクションを検証します。
h3
要素の親である要素を選択することで、ソースのURLを取得できます。
スクレイピングされたデータを使用して新しいオブジェクトを作成し、それをpeople_also_ask_questions
配列に追加します。
その調子です!Googleページから「関連する」セクションをスクレイピングできました。
ステップ8:スクレイピングしたデータをCSVにエクスポートする
people_also_ask_questions
を指定すると、次の出力が表示されます。
これだけでも素晴らしいですが、他のチームメンバーと簡単に共有できる形式だったらもっと良いでしょう。そこで、 people_also_ask_questions
をCSVファイルにエクスポートしましょう!
Python標準ライブラリからcsv
パッケージをインポートします。
次に、これを使用して出力CSVファイルにSERPデータを入力します。
ついに!「関連する質問」のスクレイピングスクリプトが完成しました。
ステップ9:仕上げ
最終的なscraper.py
スクリプトには次のコードが含まれているはずです。
100行のコードで、PAAスクレイパーを構築できました!
実行して正しく動作することを確認してください。Windowsでは、以下のコマンドでスクレイパーを起動します。
LinuxまたはmacOSでは以下を実行してください。
スクレイパーの実行が終了するのを待ちます。すると、プロジェクトのルートディレクトリにpeople_also_ask.csv
ファイルが表示されます。開くと、次の内容が表示されます。
おめでとうございます、ミッション完了です!
まとめ
このチュートリアルでは、Googleページの「関連する質問」セクションとは何か、そこに含まれるデータについて、そしてPythonを使用してそのセクションをスクレイピングする方法を学びました。ここで学んだように、データを自動的に取得するシンプルなスクリプトを構築するには、Pythonコードを数行書くだけで済みます。
ここで提示されたソリューションは小規模なプロジェクトではうまく機能しますが、大規模なスクレイピングには実用的ではありません。問題は、Googleが業界で最も先進的なアンチボット技術を複数有していることです。そのため、CAPTCHAやIP禁止によってブロックされる可能性があります。さらに、このプロセスを複数のページにまたがって拡張すると、インフラストラクチャのコストが増加します。
それまつまり、Googleを効率的かつ確実にスクレイピングすることは不可能だということでしょうか?そんなことはありません!必要なのは、これらの課題に対処できる、Bright DataのGoogle検索APIなどの高度なソリューションだけです。
Google検索APIには、「関連する質問」セクションを含むGoogle SERPページからデータを取得するためのエンドポイントが用意されています。簡単なAPI呼び出しで、必要なデータをJSONまたはHTML形式で取得できます。使用を開始する方法については、公式ドキュメントをご参照ください。
今すぐサインアップして無料トライアルを始めましょう!