使用方法 セレン のデータスクレイピングは、かなり一般的なことです。これはブラウザを自動化し、ブロックされないように実際のユーザーの活動をシミュレートすることができます。それは、GoogleのようなJavaScriptの動的に生成されたサイトをスクレイピング中に特別に有用である。さらに、それは基本的に実際のクライアントの動作をシミュレートするようにクロールの保護の任意の種類を回避するのに役立ちます。
この記事では、1000ページ以上あってもブロックされずにGoogleマップから場所を解析できるスクレーパーを開発するためのステップバイステップのチュートリアルを紹介します。
クローラーの製作に必要なもの
- Python 3+。
- Chromeブラウザがインストールされています。
- Selenium 3.141.0+ (pythonパッケージ)を使用しています。
- Chrome Driver(お使いのOS用)。
- Parselや、Beautiful SoupのようなHTMLからデータを抽出するライブラリを使用します。
Google Maps Extractorを構築するためのステップバイステップのチュートリアル
ChromeDriverのダウンロードと保存
Google ChromeでSeleniumを使用するには、次のようにしてpythonコードをブラウザにリンクさせる必要があります。 クロムドライバー.
お使いのブラウザのバージョンとOSの種類に合ったバージョンのChromeDriverをダウンロードしてください。お使いのChromeブラウザのバージョン番号はこちらで確認できます。Chrom」→「メニューアイコン(右上)」→「ヘルプ」→「Google Chromeについて」をクリックします。
chromedriver ファイルを解凍し、システム上のどこかに保存します(パスは後で使用します)。このチュートリアルの例では、プロジェクト・フォルダーに保存します。
Selenium および Parsel パッケージのインストール
以下のコマンドを実行して、SeleniumとParselのパッケージをインストールします。Parselは、後でHTMLからコンテンツを解析する際に使用します。
pip install selenium
pip install parsel # XPathやCSSセレクタを使ってHTMLからデータを抽出する。
Webdriverの初期化と起動
Webdriverを初期化する前に、これまでの手順を行い、chromedriverファイルのパスが通っていることを確認してください。以下のコードでドライバーを初期化します。新しいChromeのウィンドウが開くことを確認してください。
from selenium import webdriver
chromedrive_path = './chromedriver' # 前のステップでダウンロードしたドライバのパスを使用します。
driver = webdriver.Chrome(chromedrive_path)となります。
macでは以下のように表示されることがあります。"chromedriver cannot be opened because the developer cannot be verified "と表示されることがあります。この問題を解決するには、Finderでchromedriverをコントロールクリックし、メニューから「開く」を選択し、表示されるダイアログで「開く」をクリックします。開いたターミナルウィンドウに「ChromeDriver was started successfully」と表示されるはずです。これを閉じると、以降はコードからChromeDriverを起動できるようになります。
Googleマップページのダウンロード
ドライバを起動したら、いくつかのページを開くことができます。任意のページを開くには、"get "コマンドを使用します。
url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
ドライバ.get(url)。
マップ検索のコンテンツを解析する
ページが開かれると、Pythonコードで制御されたページがブラウザウィンドウに表示されます。以下のコードを実行すると、ChromeDriverからHTMLページのコンテンツを取得することができます。
page_content = driver.page_source。
HTMLの内容を快適に見るには、ブラウザのウィンドウ右上にあるChromeメニューを開き、「その他のツール」>「デベロッパーツール」を選択して、Chromeのデベロッパーコンソールを開いてください。これで、ページの要素を見ることができるようになるはずです。

お好みの解析ツールを使って、HTMLページからコンテンツを解析することができます。ここでは パーセル このチュートリアルでは
from parsel import Selector
response = Selector(page_content)。
リストを反復して、各場所のデータを取得します。
results = [] です。
for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
results.append({
'link': el.xpath('./a/@href').extract_first(''),
'タイトル': el.xpath('./a/@aria-label').extract_first('')
})
print(results)
Google Mapsのプレイスからの出力(短縮版)。
[
{
'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
'title':'ブラックアイアンバーガー'
},
{
'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
'title':'Fools Gold NYC'
},
{
'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
'title':'11th St.Bar'
},
...
]
抽出が完了したらドライバーを停止する
それに合わせて、削る前と後にドライバーを起動したり停止したりすることが大切です。これは、ネットサーフィンの前後にブラウザを開いたり閉じたりするのと同じです。以下のコードを実行してドライバーを閉じます。
driver.quit()。
結論と、スクレーパーのスケールアップと堅牢化のための推奨事項
Google MapsのトリッキーなHTML構造にもかかわらず、SeleniumとXPathとCSSセレクタの知識があれば、スクレイピングでかなり良い結果を出すことができます。ブラウザエミュレータを使用するこの方法は、ブロックされることからあなたを保護するはずです。しかし、アプリケーションを拡張する場合は、予期せぬトラブルを避けるために、プロキシの使用も検討する必要があります。
並列運転
ドライバをマルチプロセッシング(マルチスレッドではありません)で動作させることは可能ですが、各ドライバは1つのCPUを消費します。十分な数を確保してください。
企業規模でGoogle Mapsをスクレイピングするための究極の方法
Googleをスクレイピングするのは非常に難しいことですが、多くの企業や大企業は、独自のクローラーの開発やメンテナンスに時間をかけることなく、数百万ページのスクレイピングを開始したいと考えています。
Google Mapsのスクレイピングを始める最も簡単な方法は、次のようなものです。 Outscraperプラットフォーム (結果をCSVファイルで取得する場合)。 APIまたは SDK (コードに統合する)。
グーグルマップスクレイピングを最も簡単に始める方法
以下のコマンドを実行して、OutscraperのSDKをインストールします。
pip install google-services-api。
クライアントを初期化し、Googleでリスティングを検索したり、プレイスIDを送信して特定のリスティングを解析したりします。
* APIトークン(SECRET_API_KEY)を取得することができます。 プロフィールページ.
from outscraper import ApiClient
api_client = ApiClient(api_key='SECRET_API_KEY')
# 特定の場所にあるビジネスを検索します。
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')
# 特定の場所のデータをIDで取得する
結果 = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')
# 多数のクエリで検索(バッチ処理)
result = api_client.google_maps_search([
'restaurants brooklyn usa',
'bar brooklyn usa',
], language='en')
print(result)
結果出力(短縮)。
[
[
{
"name":"Colonie" (コロニー)
"full_address":"127 Atlantic Ave, Brooklyn, NY 11201",
"borough":"Brooklyn Heights",
"street":"127 Atlantic Ave",
"city":"brooklyn",
"postal_code":"11201",
"country_code":"US",
"country":"United States of America",
"us_state":"New York",
"state":"New York",
"plus_code": null,
"latitude":40.6908464,
"longitude":-73.9958422,
"time_zone":"America/New_York",
"popular_times": null,
"site":"http://www.colonienyc.com/",
"phone":"+1 718-855-7500",
"type":"American restaurant",
"category":"restaurants",
"subtypes":"American restaurant", "Cocktail bar", "Italian restaurant", "Organic restaurant", "Restaurant", "Wine bar",
"posts": null,
"rating":4.6,
"reviews":666,
"reviews_data": null,
"photos_count":486,
"google_id":"0x89c25a4590b8c863:0xc4a4271f166de1e2",
"place_id":"ChIJY8i4kEVawokR4uFtFh8npMQ "です。
"reviews_link":"https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=en&gl=US",
"reviews_id":"-4277250731621359134",
"photo":"https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
"street_view":"https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
"working_hours_old_format":"Monday:Tuesday:定休日:水曜日水曜日:休館日 木曜日:休館日 金曜日:休館日金曜日:5:30PM|土曜日:11:00PM土曜日:11AM_20133PM,5\u2013:30PM|日曜日:11AM_20133PM,5┄u2013:30PM
"working_hours":{
"Monday":"5\\20139:30PM"
「Tuesday":"Closed",
「Wednesday":"Closed",
「Thursday"5\\30pm"
「Friday:"5\\2013:30PM "です。
「Saturday"11AM\\u20133PM,5\\u20139:30PM",
"Sunday":"11AM\\u20133PM,5\\u20139:30PM"
},
"business_status":"OPERATIONAL",
},
"reserving_table_link":"https://resy.com/cities/ny/colonie",
"booking_appointment_link":"https://resy.com/cities/ny/colonie",
"owner_id":"114275131377272904229",
"verified": true,
"owner_title":"Colonie",
"owner_link":"https://www.google.com/maps/contrib/114275131377272904229",
"location_link":"https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
...
},
...
]
]
おまけ。Googleレビュースクレイピングを最も簡単に始める方法
以下のコードを実行することで、レビューを抽出することができます(pythonパッケージをインストールし、クライアントを起動していることが前提です)。
# 特定の場所のレビューをidで取得する
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')
# 検索クエリで見つかった場所のレビューを取得する
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='ja')
# 過去24時間の新しいレビューのみを取得する
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())
result = api_client.google_maps_reviews(
'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')。
結果出力(短縮)。
{
"name":"Memphis Seoul",
"address":"569 Lincoln Pl, Brooklyn, NY 11238, \u0421\u043e\u043b\u0443\u0447\u0435\u043d\u0456"
"address_street":"569 Lincoln Pl "です。
"owner_id""100347822687163365487",
"owner_link":"https://www.google.com/maps/contrib/100347822687163365487",
...
"reviews_data":[
{
"google_id":"0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link":"https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
"autor_name":"Eliott Levy",
"autor_id":"112314095435657473333",
"review_text":"Very good local comfort fusion food !\\キムチコールスロー !Such a amazing idea !",
"review_link":"https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating":5,
"review_timestamp":1560692128,
"review_datetime_utc":"06/16/2019 13:35:28",
"review_likes": null
},
{
"google_id":"0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link":"https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
"autor_name":"fenwar1",
"autor_id":"106144075337788507031",
"review_text":"数種類のホットソースを使った素晴らしい手羽先。ミートローフスライダーは、肉厚の肉の上にスローが乗っていて、素晴らしいソースがかかっていて、とても美味しいです。\\常連さんになっちゃいました。
"review_link":"https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating":5,
"review_timestamp":1571100055,
"review_datetime_utc":"10/15/2019 00:40:55",
"review_likes": null
},
...
]
}
0コメント