GoogleローカルスクレーパーAPI: ローカルパックをJSONに変換する
Web Data Collection Specialist
主なポイント:
- 1つのリクエスト、1つのアクター。 Scrapeless Scraper APIは、Googleのローカルパックを
scraper.google.searchアクターに対する単一のPOSTに変換します。ブラウザーを操作する必要もなく、マークアップを解析する必要もありません。 tbm: "lcl"がスイッチです。 入力{ "q": "サンフランシスコのコーヒーショップ", "tbm": "lcl" }を送信すると、アクターはウェブSERPの代わりに地図に基づいたビジネスリスティングを返します。- 生のHTMLではなく構造化されたフィールド。 レスポンスは解析されたローカルオブジェクトであり、
local_results.places[]には、タイトル、評価、レビュー数、住所、価格帯、および写真サムネイルが含まれ、最上位レベルでフラット化されています。 - フィルターチップも含まれます。
suggested_searchesは「現在営業中 / 評価が高い / 安い」のチップを、フォローしやすいGoogleのURLとして提供するので、同じクエリを再構築することなく切り替え可能です。 - プロキシもボット対策もあなたの側では不要。 自宅用の出口、ジオルーティング、およびレンダリングはサーバー側で実行されます。あなたはクエリを送信し、JSONを読み取るだけです。
- 無料で開始可能。 新しいScrapelessアカウントには、無料のScraper APIクレジットが含まれています。app.scrapeless.comでサインアップしてください。
イントロダクション:GoogleのローカルパックをJSONに変換
Googleのローカルパックは、ローカル検索の最上部に表示されるビジネスリスティングのボックスセットで、誰かが「サンフランシスコのコーヒーショップ」や「近くの配管工」を検索すると表示される地図に基づいたカードです。各カードには、名前、カテゴリ、星評価、レビュー数、住所、および価格帯が含まれています。これは、表面的なローカル意図の検索によって実際にクリックされるものであり、多くの実用的な作業の背後にあるデータセットとなっています。
- ローカルランク追跡 — 指定した都市のクエリに対するビジネスのランキングを確認します。
- 競合モニタリング — 時間をかけて競合の評価とレビュー数を追跡します。
- リードリスト — カテゴリーとローカリティのクエリに対してランキングされているビジネスを構造化された表に引き出します。
- レビューと感情サンプリング — 各カードは、スケールで収集可能な代表的なレビューのスニペットを表示します。
- 市場規模の測定 — metro内でどのタイプのビジネスがランクインしているか、評価がどのようにクラスター化されているかをカウントします。
手作業でそのパックを引き出すことは、JavaScript重視の検索ページをレンダリングし、Googleのレート制限をクリアし、マークアップに対してセレクターを書くことを意味します。Scraper APIはこれら3つをサーバー側で処理し、解析されたオブジェクトを手渡します。
Scraper APIの利点
従来のローカルスクレーパーは、ボット対策層をクリアし、ページをレンダリングし、カードを解析するという3つの仕事を組み合わせたものです。Scrapeless Scraper APIは、それらを1回の呼び出しに統合します。scraper.google.searchアクターを指定し、クエリとtbm: "lcl"を渡すと、解析されたローカルパックが返ってきます。
- ブラウザもパーサーも維持する必要なし。 アクターはGoogleのローカル結果をレンダリングし、解析します。フィールドが返され、DOMを渡る必要はありません。
- 住宅用出口とジオルーティングが組み込まれています。 クエリ文字列を送信すると、アクターがネットワーク層とJavaScriptのレンダリングを処理します。
- 1つのキー、1つの形。 単一の
x-api-tokenが呼び出しを認証し、ローカルパックは常に同じ解析された形で返されるため、1回書いたクライアントはクエリや都市を超えて再利用されます。
無料プランでAPIキーを取得するには、app.scrapeless.comにアクセスしてください。Googleのローカルパックは、他のGoogle検索の表面と共にDeep SerpApiファミリーの内側に存在します。価格表に記載されています。
前提条件
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップしてください。
- クイックテスト用の
curl、または下記のクライアント用にPython 3.10以上が必要です。 - HTTPとJSONの基本的な理解。
キーを環境に保存して、コード内に残らないようにします:
bash
export SCRAPELESS_API_KEY=your_api_token_here
リクエスト
ローカルパックはv1 Scraper APIエンドポイントとGoogle検索アクターを使用します。ローカルパックを選択するには1つの入力フィールドが必要で、そのtbmをlclに設定します。
- エンドポイント:
POST https://api.scrapeless.com/api/v1/scraper/request - 認証: ヘッダー
x-api-token: $SCRAPELESS_API_KEY - アクター:
scraper.google.search(tbm: "lcl"はウェブSERPの代わりにローカルパックを選択します)
リクエストボディは { "actor": "<name>", "input": { … } } です:
json
{
"actor": "scraper.google.search",
"input": { "q": "サンフランシスコのコーヒーショップ", "tbm": "lcl" }
}
| 入力フィールド | 必須 | 説明 |
|---|---|---|
q |
はい | ローカル検索クエリ — もっとも関連性の高いパックを得るために都市や地域を含めます(例:サンフランシスコのコーヒーショップ) |
tbm |
はい | ローカルパックを選択するにはlclに設定します。ウェブSERPを得るには省略または変更します。 |
例
最速のチェックは1つのcurlです。これはアクターと入力を投稿し、解析されたローカルオブジェクトを印刷します:
bash
curl -sS -X POST https://api.scrapeless.com/api/v1/scraper/request \
-H "Content-Type: application/json" \
-H "x-api-token: $SCRAPELESS_API_KEY" \
-d '{
"actor": "scraper.google.search",
"input": { "q": "サンフランシスコのコーヒーショップ", "tbm": "lcl" }
}'
同じ呼び出しをPythonで行うと、環境からキーを読み取り、解析された応答を返します:
python
import os
import json
import requests
ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
def scrape_local(query: str) -> dict:
resp = requests.post(
ENDPOINT,
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={"actor": "scraper.google.search", "input": {"q": query, "tbm": "lcl"}},
timeout=120,
)
resp.raise_for_status()
return resp.json()
if __name__ == "__main__":
data = scrape_local("サンフランシスコのコーヒーショップ")
for place in data["local_results"]["places"]:
print(place["position"], place["title"], place["rating"], place["address"])
scraper.google.searchは解析されたローカルパックを最上位レベルにフラット化します。resultラッパーを展開する必要はありません。直接local_results.places[]を読み取ります。
無料プランでAPIキーを取得する:app.scrapeless.com
返されるもの
アクターは解析されたローカルオブジェクトを直接返し、保存されたレンダリングされたHTMLを指すmetadataエンベロープを含んでいます。q: "サンフランシスコのコーヒーショップ", tbm: "lcl"のキャプチャされた実行は、20のランク付けされた場所を返しました:
json
// live scraper.google.search (tbm: "lcl") 実行からの最上位の形状です。
// サムネイルのbase64とほとんどのplaces[]エントリは削除されています;フィールドの値は実際のものです。
{
"local_results": {
"places": [
{
"position": 1,
"title": "The Coffee Berry SF",
"type": " コーヒーショップ",
"rating": 4.9,
"reviews": 588,
"reviews_original": "(588)",
"price": "$",
"address": "1410 Lombard St",
"phone": " $1–10 ",
"hours": "4.9(588) ",
"extensions": ["エスプレッソは美味しく、スタッフはとても親切で歓迎してくれました。"],
"thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABA…",
"place_id": "",
"place_id_search": "",
"lsig": "",
"gps_coordinates": { "latitude": 0, "longitude": 0 }
},
{
"position": 8,
"title": "Delah Coffee",
"type": " コーヒーショップ",
"rating": 4.7,
"reviews": 1100,
"reviews_original": "(1.1K)",
"price": "$",
"address": "370 4th St",
"phone": "カーブサイドピックアップ",
"hours": "店内飲食",
"extensions": ["店内飲食", "カーブサイドピックアップ", "接触なし配達"],
"thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABA…",
"place_id": "",
"place_id_search": "",
"lsig": "",
"gps_coordinates": { "latitude": 0, "longitude": 0 }
}
]
},
"search_information": {
"query_displayed": "サンフランシスコのコーヒーショップ",
"organic_results_state": "正確なスペルの結果",
"total_results": 0,
"time_taken_displayed": ""
},
"suggested_searches": [
{
"name": "今営業中",
"q": "今営業中のサンフランシスコのコーヒーショップ",
"link": "https://www.google.com/search?…&udm=1&q=coffee+shops+in+San+Francisco+open+now",
"uds": "",
"thumbnail": ""
}
],
"pagination": {},
"metadata": {
"engine": "google.search",
"rawUrl": "https://api.scrapeless.com/storage/scrapeless.scraper.google.search/…html"
}
}
各places[]カードのフィールド:
| フィールド | タイプ | 説明 |
|---|---|---|
position |
数字 | ローカルパック内の順位、1から始まる |
title |
文字列 | ビジネス名 |
type |
文字列 | ビジネスカテゴリ(例:コーヒーショップ、元の値には前の空白が含まれます) |
rating |
数字 | 星評価(例:4.9) |
reviews |
数字 | 整数に正規化されたレビュー数(例:588(3.4Kは3400になる)) |
reviews_original |
文字列 | Googleが表示するレビュー数(例:(3.4K)) |
price |
文字列 | 価格区分(例:$) |
address |
文字列 | 住所(例:1410 Lombard St) |
phone |
文字列 | フリーテキストカードスロット - 下記の注を参照 |
hours |
文字列 | フリーテキストカードスロット - 下記の注を参照 |
extensions |
文字列[] | 代表的なレビューの抜粋、またはオーダーを示すカードのサービスオプションリスト |
thumbnail |
文字列 | インラインのdata:image/jpeg;base64,…の場所の写真のブロブ |
place_id / place_id_search / lsig |
文字列 | 場所識別子;このキャプチャでは空です |
gps_coordinates |
オブジェクト | { 緯度, 経度 }; このキャプチャでは 0/0 |
カードの周りのトップレベルキー:
| キー | 含まれるもの |
|---|---|
local_results.places[] |
ランキングされたビジネスカード |
search_information |
クエリのエコーと結果の状態 |
suggested_searches[] |
ローカルフィルターチップ(今開いている / 高評価 / 安い / 高級 / 配達)をGoogleのURLとして |
pagination |
ページングリンク(このクエリでは空) |
metadata |
engineとrawUrl、レンダリングされたHTMLの保存されたコピー |
キャプチャされた形からのいくつかの正直な観察:
- オブジェクトはフラット化されています。
local_results.places[]は繰り返す配列です — 他のアクターとは異なり、resultラッパーはありません。 reviewsとreviews_originalは同じ数を持っています。 一つは数学用の整数、もう一つはGoogleの表示文字列((3.4K))。パイプラインに必要な方を読み取ってください。phoneとhoursはGoogleが各カードスロットに表示する内容を追跡します。 多くのローカルカードでは、それは価格帯("$1–10")やサービスフラグ(Curbside pickup,Dine-in)であり、リテラルな電話番号や営業時間ではありません。両方を自由テキストとして扱い、依存する前に検証してください。extensionsはカードごとに分岐します。 ほとんどのカードは単一のレビューのスニペットを返します; 注文オプションがあるカードはサービスリスト(Dine-in,Curbside pickup,No-contact delivery)を返します。どれを受け取ったかを確認してください。- 識別子と座標フィールドは空で戻ることがあります。
place_id、place_id_search、lsig、およびgps_coordinatesはスキーマに存在しますが、カードごとに空またはゼロである可能性があります — 欠如したフィールドはnullableとして扱ってください。 metadata.rawUrlはあなたの脱出ハッチです。 解析されたオブジェクトに表れないフィールドが必要な場合、レンダリングされたHTMLを保存します。
結論
Googleのローカルパックをスクレイピングすることは、一つの決定と一つのリクエストに還元されます:scraper.google.searchアクターを選択し、{ "q": "<query>", "tbm": "lcl" }をあなたのx-api-tokenで送信し、local_results.places[]を解析されたJSONとして読み取り返します。プロキシのローテーション、JavaScriptレンダリング、および解析はすべてサーバー側で実行されるため、同じクライアントがクエリ文字列を変更することで任意の都市やカテゴリを指します。Google検索のAI応答側については、Google AI Overview scraper guideが、同じ方法で回答ブロックとその引用をキャプチャする手順を説明しています。qにローカリティを固定し、tbm: "lcl"を設定し、自由テキストと識別子フィールドをnullableとして扱ってください。
AI搭載のローカル検索パイプラインを構築する準備はできましたか?
コミュニティに参加して無料プランを取得し、ローカル検索パイプラインを構築している開発者とつながりましょう: Discord · Telegram。
app.scrapeless.comで無料のScraper APIクレジットにサインアップし、あなたのパイプラインが必要とするクエリ、都市、カテゴリにscraper.google.searchアクターを指し示してください。
FAQ
Q: Google Localをスクレイピングすることは合法ですか?
ローカルパックは公に表示されるデータです。ルールは管轄区域やGoogleの利用規約によって異なるため、規定のToSを確認し、スケールで運用する前に使用事例について相談してください。GDPRやCCPAで保護されている個人データを決して収集しないでください。
Q: プロキシは必要ですか?
いいえ。住宅用の出口とジオルーティングはアクターに組み込まれています — あなたがクエリを送信すると、アクターがネットワーク層とレンダリングを処理します。
Q: tbm: "lcl"は何をするのですか?
Googleのローカルパック — 地図に基づいたビジネスリスティング — を選択します。これを省略するか変更すると、同じアクターがクエリに対するオーガニックなウェブ結果を返します。
Q: いくつの場所が戻りますか?
アクターは、クエリに対してGoogleがランク付けしたカードを返します。「サンフランシスコのコーヒーショップ」のキャプチャされた実行は20を返しました。カウントはクエリ、カテゴリ、ローカリティによって異なります。
Q: 別の都市をターゲットにするにはどうすればいいですか?
ローカリティをqに入れます。アクターはクエリ文字列を読み取るため、AustinのコーヒーショップやChicagoの配管工がその地域のローカルパックを返します。
Q: フィールドが欠けている場合、生のHTMLはどこにありますか?
metadata.rawUrlはレンダリングされたページのコピーを保存します。アクターが解析されたオブジェクトに表れない任意のフィールドを解析するために使用します。
Q: AIエージェントやSDKなしで実行できますか?
はい。これは通常のHTTPです — curl、Pythonのrequests、Nodeのfetch、または任意のHTTPクライアントが直接動作します。SDKは必要ありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



