検索結果のスクレイピング
この記事では、WEBページから情報を取得する方法を説明します。
【できるようになること】
- ScrapePageアクションを利用
- スクレイピング結果をシートに書き込む
Google検索サービスのロボット判定強化により、AUTOROからの検索についても検索結果が表示されなくなりました。
別の検索エンジンを利用するか、Web検索アクションをご利用ください。
Googleで特定のキーワードを検索。
検索結果のタイトルとURLをスプレッドシートにリスト化する。
Google検索/空のスプレッドシート
この記事で紹介するワークフローでは以下の作業内容を設定します。
- Google検索を開く
- 検索ワードを入力する
- 検索を実行する
- 検索結果からタイトルとリンク先URLをスクレイピングする
- スクレイピング結果をスプレッドシートに書き込む
下記手順にてワークフローを設定します。
- OpenBrowserアクションを設定します。
- URLパラメータに「https://www.google.com/?hl=ja」を入力します。
- TypeTextアクションを設定します。
- CSSセレクタには
textarea
、文字列には「福岡市 観光」を入力します。

ここまで設定したら、検索バーに文字入力できているか実行して確認してみましょう。
実際のブラウザでスクレイピング箇所を確認します。
今回取得するのは、以下画像の赤枠の部分です。
ScrapePageアクションでは、赤枠部分をまとめて一気に取得することが可能です。
スクレイピングする位置のCSSセレクタを確認します。
今回は1ページ内の全検索結果のうち、タイトルとリンク(URL)を取得することが目的です。よって、各検索結果が共通で持っているCSSセレクタを見つけ出す必要があります。
確認の結果、今回取得した要素群のCSSセレクタは以下であることが判明しました。
.yuRUbf a
※リンクのURLはa要素に含まれます。
スクレイピング結果を書き込むためのスプレッドシートを準備します。
- GetSperadsheetアクションを設定します。
- プロバイダIDを選択します。
- 書き込むスプレッドシートを選択します。
GoogleのCSSセレクタは、変動することがあります。
2023-08-02時点のCSSセレクタは以下となります。
.yuRUbf a, .DhN8Cf a
このワークフローはお手元で複製可能です。方法はこちらをご参照ください。
# ブラウザを開く +open_browser_1: action>: OpenBrowser url: 'https://www.google.com/?hl=ja' lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true useShadowDomSelector: false private: false # 文字入力 +type_text_1: action>: TypeText browser: +open_browser_1 selector: textarea text: '福岡市 観光' clearValue: false ignoreError: true private: false # キーを送信_Enterキーを叩く +send_keys_1: action>: SendKeys browser: +type_text_1 selector: body keys: ["Enter"] waitAfter: 3000 ignoreError: true private: false # スクレイピング +scrape_page_1: action>: ScrapePage browser: +send_keys_1 selector: '.yuRUbf a, .DhN8Cf a' text_only: false ignoreError: true private: false # 既存のスプレッドシートを取得 +get_spreadsheet_1: action>: GetSpreadsheet provider: '' spreadsheet_id: '' private: false meta: display: # 各要素について繰り返す +for_each_1: for_each>: data: +scrape_page_1 _do: # 末尾に値を追加_タイトルとURLをシートに書き込む +append_values_1: action>: AppendValues spreadsheet: +get_spreadsheet_1 range: 'シート名!A:A' values: ["${data.innerText}","${data.href}"] private: false
複数のページから情報を取得する場合は、繰り返し処理を入れる必要があります。
繰り返し処理を入れた場合のアプローチ方針としては、以下3つが代表的です。
- xページ目まで繰り返す
- 次のページボタンがある限り、最大x回繰り返す
- 総件数から、ページ数を算出して繰り返す
本セクションでは、上記3つの内容を紹介します。
Webページのサンプルとして、本サイトを使用します。
参考:変数を使ってページ遷移する
総件数から、ページ数を算出して繰り返す例を紹介します。
この方法は、「全x件」など総件数が記載のあるサイトで有効です。
ポイントは以下5点です。
- 繰り返しを追加している
- 繰り返しの中に、スクレイピング系のアクションを入れている
- 繰り返しの前に、WEBサイトから総件数を取得するアクションを入れる
- 繰り返しの回数には、
${Math.ceil(総件数の変数 / 1ページあたりの表示件数)}
として、繰り返し回数を割り出す - 繰り返しの最後で、次のページ遷移するボタンをクリックしている
このワークフローはお手元で複製可能です。方法はこちらをご参照ください。
# ブラウザを開く_AUTOROサポートサイトで「変数」と検索した結果 1ページ目 +open_browser_1: action>: OpenBrowser url: 'https://support.autoro.io/?s=%E5%A4%89%E6%95%B0&post_type=docs' lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true windowSize: '1280 x 720' useShadowDomSelector: false private: false # 既存のスプレッドシートを取得 +get_spreadsheet_1: action>: GetSpreadsheet provider: '' spreadsheet_id: '' private: false meta: display: null # 繰り返し_最大3ページ数分 +loop_1: loop>: 3 _do: # スクレイピング +scrape_page_1: action>: ScrapePage browser: +open_browser_1 selector: 'div.b_top_post_content > a' text_only: false ignoreError: true private: false # 各要素について繰り返す +for_each_1: for_each>: data: +scrape_page_1 _do: # リストを作成 +create_list_1: action>: CreateList items: ["${data.innerText}","${data.href}"] private: false # 末尾に値を追加 +append_values_1: action>: AppendValues spreadsheet: +get_spreadsheet_1 range: '書き込み先シート名!A:A' values: +create_list_1 private: false # キーを送信_最下部までスクロール(本サイトではこの操作が必要です) +send_keys_1: action>: SendKeys browser: +open_browser_1 selector: body keys: ["End"] ignoreError: true private: false # クリック_次のページへ +click_1: action>: Click browser: +open_browser_1 selector: 'a.next.page-numbers' confirm: true waitAfter: 2500 ignoreError: true timeout: 4000 private: false # ブラウザを閉じる +close_browser_1: action>: CloseBrowser browser: +open_browser_1 private: false
このワークフローはお手元で複製可能です。方法はこちらをご参照ください。
# ブラウザを開く_AUTOROサポートサイトで「salesforce」と検索した結果 1ページ目 +open_browser_1: action>: OpenBrowser url: 'https://support.autoro.io/?s=salesforce' lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true windowSize: '1280 x 720' useShadowDomSelector: false private: false # 既存のスプレッドシートを取得 +get_spreadsheet_1: action>: GetSpreadsheet provider: '' spreadsheet_id: '' private: false meta: display: # 繰り返し_次のページボタンがある限り、最大10ページ数分 +loop_1: loop>: 10 _do: # スクレイピング +scrape_page_1: action>: ScrapePage browser: +open_browser_1 selector: 'div.b_top_post_content > a' text_only: false ignoreError: true private: false # 各要素について繰り返す +for_each_1: for_each>: data: +scrape_page_1 _do: # リストを作成 +create_list_1: action>: CreateList items: ["${data.innerText}","${data.href}"] private: false # 末尾に値を追加 +append_values_1: action>: AppendValues spreadsheet: +get_spreadsheet_1 range: 'シート24!A:A' values: +create_list_1 private: false # 要素を見つける_次のページボタンはあるか? +find_element_1: action>: FindElement browser: +open_browser_1 find_by: selector value: 'a.next.page-numbers' timeout: 3000 visible: true private: false # 変数に保存_次のページボタンの有無 +store_value_1: action>: StoreValue key: hasNextPage value: +find_element_1 private: false # 真のとき_次のページボタンあり +if_1: if>: ${hasNextPage} _do: # キーを送信_最下部までスクロール(本サイトではこの操作が必要ですが、必要のないサイトもあります) +send_keys_1: action>: SendKeys browser: +open_browser_1 selector: body keys: ["End"] ignoreError: true private: false # クリック_次のページへ +click_1: action>: Click browser: +open_browser_1 selector: 'a.next.page-numbers' confirm: true waitAfter: 2500 ignoreError: true timeout: 4000 private: false # 真のとき_次のページボタンなし +if_2: if>: ${!hasNextPage} _do: # テキストを作成 +text_1: action>: Text text: '次のページボタンがありません。繰り返しを終了します' private: false # 繰り返しを終了する +break_if_1: break_if>: true
このワークフローはお手元で複製可能です。方法はこちらをご参照ください。
# ブラウザを開く_AUTOROサポートサイトで「変数」と検索した結果 1ページ目 +open_browser_1: action>: OpenBrowser url: 'https://support.autoro.io/?s=salesforce' lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true confirm: true windowSize: '1280 x 720' useShadowDomSelector: false private: false # 既存のスプレッドシートを取得 +get_spreadsheet_1: action>: GetSpreadsheet provider: '' spreadsheet_id: '' private: false meta: display: null # テキストを作成 総件数を取得します(当サイトには総件数の表記がないため、テキストを作成しています。) +text_2: action>: Text text: 55 private: false # 変数に保存 +store_value_2: action>: StoreValue key: count value: +text_2 private: false # 繰り返し回数を計算 +loop_1: loop>: ${Math.ceil(count / 10)} _do: # スクレイピング +scrape_page_1: action>: ScrapePage browser: +open_browser_1 selector: 'div.b_top_post_content > a' text_only: false ignoreError: true private: false # 各要素について繰り返す +for_each_1: for_each>: data: +scrape_page_1 _do: # リストを作成 +create_list_1: action>: CreateList items: ["${data.innerText}","${data.href}"] private: false # 末尾に値を追加 +append_values_1: action>: AppendValues spreadsheet: +get_spreadsheet_1 range: 'シート24!A:A' values: +create_list_1 private: false # キーを送信 本サイトではこの操作が必要ですが、必要のないサイトもあります +send_keys_1: action>: SendKeys browser: +open_browser_1 selector: body keys: ['Enter'] ignoreError: true private: false # クリック_次のページへ +click_1: action>: Click browser: +open_browser_1 selector: 'a.next.page-numbers' confirm: true waitAfter: 2500 ignoreError: true timeout: 4000 private: false