Glassdoor は、求職者、従業員、雇用主にとって同様に優れたリソースです。給与、クチコミ、面接、オフィス写真など、企業・求人情報を豊富に掲載。これらすべてのデータにより、Glassdoor は Web スクレイピングの対象として魅力的になります。
この包括的なガイドでは、Glassdoor からさまざまな種類のデータをスクレイピングするためのさまざまなテクニックと戦略について説明します。
Glassdoor のアーキテクチャの概要
スクレイピングの詳細に入る前に、Glassdoor の Web サイトがどのように構成されているかを理解しましょう。
クライアント側のレンダリング – Glassdoor は React を使用して、ほとんどの UI をサーバー側ではなくクライアント側でレンダリングします。これは、ブラウザに提供される初期 HTML が最小限であり、ほとんどのコンテンツが JavaScript でロードおよびレンダリングされることを意味します。
グラフQL API – Glassdoor ページに表示されるデータは、GraphQL API 経由で取得されます。 Web サイトは、この API に AJAX リクエストを送信して構造化データを取得し、それがページ上にレンダリングされます。
強力な耐スクレーピング – Glassdoor は、ボットの検出、レート制限、スクレーパーのブロックなど、さまざまなスクレイピング防止対策を採用しています。
要約すると、Glassdoor は、GraphQL を使用してデータを取得し、強力な抗スクレイピング防御を備えた単一ページの React アプリです。このアーキテクチャは、スクレイパーにいくつかの特有の課題をもたらし、それを克服する必要があります。
スクレイピング会社概要ページ
Glassdoor の各企業には、本社、業界、収益などの基本情報を含む専用の概要ページがあります。これらの詳細を収集する方法を見てみましょう。
会社の概要ページを取得するには、ページ URL に含まれる Glassdoor ID が必要です。
https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.16,22.htm
ここに EI_IE9079
はGoogleの企業IDを表します。任意の会社の URL からこの ID を抽出して、概要ページの URL を構築できます。
このページの生の HTML をスクレイピングしても、構造化データは得られません。重要なのは、構造化された JSON 形式のすべての情報を含む GraphQL データをページから抽出することです。
GraphQL データを抽出する方法は次のとおりです。
import json
import re
html = # page HTML
match = re.search(r‘window.__ENV__ = (\{.*?\})‘, html)
if match:
data = json.loads(match.group(1))
これにより、ページの完全な GraphQL データが得られます。次のようなフィールドを解析できるようになりました description
, headquarters
, revenue
、その他:
overview = data[‘EmployerPage‘][‘Employer‘]
print(overview[‘description‘])
print(overview[‘headquarters‘])
print(overview[‘revenue‘])
以上です!わずか数行の Python コードで、あらゆる企業の Glassdoor 概要の構造化データを抽出できます。
求人情報のスクレイピング
Glassdoor では、企業が掲載する募集中の求人情報を閲覧できます。これらのリストには、タイトル、場所、説明などが含まれます。
企業の求人を取得するには、次の場所に移動します。
https://www.glassdoor.com/Jobs/Google-Jobs-E9079.htm
求人リストは、下にスクロールするかページを変更するときに、AJAX 呼び出しを介して動的にロードされます。データは再び GraphQL から取得されるため、それを解析する必要があります。
まず、ページ 1 にリクエストを送信して、ページ数の計算に使用する合計ジョブ数を取得します。次に、各ページをスクレイピングしてジョブ データを抽出します。
import math
import json
def get_jobs(companyId):
url = f‘https://www.glassdoor.com/Jobs/-Jobs-E{companyId}.htm‘
# request page 1 to get total job count
page = requests.get(url)
total = extract_job_count(page.text)
pages = math.ceil(total / 20)
jobs = []
# scrape data from each page
for page in range(1, pages+1):
page = requests.get(f‘{url}?p={page}‘)
data = json.loads(extract_graphql(page.text))
jobs.extend(data[‘jobs‘])
return jobs
これにより、あらゆる企業のすべてのジョブを体系的に収集できるようになります。重要なのは、合計ジョブ数に基づいてページを計算し、AJAX 呼び出しを介してページ分割することです。
企業レビューのスクレイピング
Glassdoor で最も価値のあるデータはおそらくレビューです。企業のすべてのレビューを収集する方法について説明しましょう。
求人と同様に、企業レビュー ページに移動します。
https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm
レビューがどのようにページ分割されるかを理解する必要があります。 Glassdoor ではページごとに固定数のレビューが表示されるため、完全なデータを取得するにはすべてのページをスクレイピングする必要があります。
レビュー ページの数は、 numberOfPages
GraphQL データのフィールド。次に、各ページをページ分割してレビューを収集します。
import math
import json
def get_reviews(companyId):
url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘
# extract number of pages from initial request
page = requests.get(url)
data = json.loads(extract_graphql(page.text))
pages = data[‘numberOfPages‘]
reviews = []
for page in range(1, pages+1):
page = requests.get(f‘{url}?p={page}‘)
data = json.loads(extract_graphql(page.text))
# extract reviews
reviews.extend(data[‘reviews‘])
return reviews
ここでは、事前にレビュー ページの数を抽出し、各ページをループしてレビューの完全なセットを構築しています。
このテクニックを使えば、Glassdoor 上のあらゆる企業のすべてのレビューをスクレイピングできます。
給料をかき集める
口コミだけでなく給与データも非常に参考になります。 Glassdoor には、各企業専用の給与セクションがあります。給与記録のスクレイピングを見てみましょう。
まずは給与ページの URL から始めます。
https://www.glassdoor.com/Salary/Google-Salaries-E9079.htm
私たちの一般的なアプローチには、次のことが含まれます。
- 給与総額からページ数を計算する
- 各ページのページ送りによる給与記録のスクレイピング
実装は次のとおりです。
import math
import json
def get_salaries(companyId):
url = f‘https://www.glassdoor.com/Salary/-Salaries-E{companyId}.htm‘
# extract page count
page = requests.get(url)
data = json.loads(extract_graphql(page.text))
pages = data[‘numPages‘]
salaries = []
for page in range(1, pages+1):
page = requests.get(f‘{url}?p={page}‘)
data = json.loads(extract_graphql(page.text))
# extract salary records
salaries.extend(data[‘salaries‘])
return salaries
これにより、複数のページにわたって会社のすべての給与を体系的に収集することができます。
面接の質問をスクレイピングする
インタビューの洞察は、Glassdoor のもう 1 つの優れたデータ リソースです。企業に投稿されたすべての面接の質問を収集する方法を見てみましょう。
同社のインタビューページは次の場所にあります。
https://www.glassdoor.com/Interview/Google-Interview-Questions-E9079.htm
インタビューの質問は、下にスクロールするとき、またはページを変更するときに、AJAX リクエストを介して動的にロードされます。
私たちのゲームプランはよく知られています。
- 総問題数からページ数を計算
- 各ページから質問を抽出
実装は次のとおりです。
import math
import json
def get_questions(companyId):
url = f‘https://www.glassdoor.com/Interview/-Interview-Questions-E{companyId}.htm‘
# get total question count
page = requests.get(url)
data = json.loads(extract_graphql(page.text))
total = data[‘interviewQuestionCount‘]
pages = math.ceil(total / 20)
questions = []
for page in range(1, pages+1):
page = requests.get(f‘{url}?p={page}‘)
data = json.loads(extract_graphql(page.text))
# extract questions
questions.extend(data[‘interviewQuestions‘])
return questions
要約すると、質問数に基づいて総ページ数を計算し、AJAX 呼び出しを通じてページ分割し、質問を抽出することで、企業の面接に関するすべての洞察を得ることができます。
オフィスの写真をスクレイピング
Glassdoor データの抽出を完了するには、きちんとした視覚的な洞察を提供する会社のオフィスの写真もスクレイピングしましょう。
企業の写真ページには次の場所からアクセスできます。
https://www.glassdoor.com/Photos/Google-Office-Photos-E9079.htm
標準のページネーション戦略が適用されます。写真の総数からページを計算し、AJAX 呼び出しを通じてページネーションし、写真を抽出します。
import math
import json
def get_photos(companyId):
url = f‘https://www.glassdoor.com/Photos/-Office-Photos-E{companyId}.htm‘
# get total photo count
page = requests.get(url)
data = json.loads(extract_graphql(page.text))
total = data[‘officePhotoCount‘]
pages = math.ceil(total / 20)
photos = []
for page in range(1, pages+1):
page = requests.get(f‘{url}?p={page}‘)
data = json.loads(extract_graphql(page.text))
# extract photos
photos.extend(data[‘officePhotos‘])
return photos
これで、会社で利用可能なすべてのオフィス写真をスクレイピングできるようになります。
アンチスクレイピングへの対処
ここで説明した手法を使用すると、Glassdoor からさまざまなデータ ポイントを抽出できますが、大規模な場合は通常、スクレーパーがブロックされます。
Glassdoor には、徹底的なデータ抽出を防ぐための一連のアンチスクレイピング メカニズムが備わっています。
- IPブロッキング
- ブラウザの指紋
- ボット検出システム
- 帯域制限
Glassdoor をスクレイピングする際にブロックを回避するためのヒントをいくつか紹介します。
プロキシの使用: リクエストごとに異なるレジデンシャル プロキシをローテーションして、スクレイパーが異なるユーザーとして表示されるようにします。
リミットレート: リクエスト間に遅延があることを確認し、適度な速度でスクレイピングします。
ミミックブラウザ: 実際のブラウザのように表示されるように、有効な User-Agent、Accept ヘッダー、および Javascript を有効に設定します。
モニターブロック: IP またはプロキシがブロックされているかどうかを確認し、それに応じてデータセンターまたはプロバイダーを切り替えます。
スクレイピングサービスを利用する: アンチスクレイピングメカニズムをバイパスするためのサポートが組み込まれている ScraperAPI や Octoparse などのスクレイピング API を活用します。
適切な予防措置を講じれば、ブロックされることなく Glassdoor から大規模なデータを抽出することが可能です。
ScraperAPI を使用して Glassdoor をスクレイピングする
ScraperAPI は、スクレイピング対策のすべての課題を処理し、大規模なデータ抽出を可能にする有料のスクレイピング API です。
Ajax クロール、プロキシをサポートし、Python リクエストなどの一般的なライブラリと直接統合します。
ScraperAPI を使用して企業レビューを収集する方法は次のとおりです。
import requests
import math
import json
API_KEY = ‘XXX‘ # assign key
def get_reviews(companyId):
url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘
# initial request to get page count
response = requests.get(url,
headers={‘apikey‘: API_KEY})
pages = extract_page_count(response.text)
reviews = []
for page in range(1, pages+1):
response = requests.get(f‘{url}?p={page}‘,
headers={‘apikey‘: API_KEY})
data = json.loads(response.text)
reviews.extend(data[‘reviews‘])
return reviews
ここで、ScraperAPI はプロキシ、ブラウザー、その他の側面を処理して、データ抽出に集中できるようにします。
これは、スクレーピング防止システムを心配することなく、スケーラブルな Glassdoor スクレーパーを構築する簡単な方法です。
法的な考慮事項
Glassdoor スクレーパーを構築するときは、作業が法に準拠していることを確認することが重要です。考慮すべき重要な側面は次のとおりです。
利用規約 – Glassdoor の ToS を調べて、そのデータの使用に関する許可と制限を理解します。一般に、非営利目的で定期的に妥当な量をスクレイピングすることは許可されています。
個人データ – プライバシーの問題を引き起こす名前、電子メール ID などの個人ユーザー データを Glassdoor からスクレイピングすることは避けてください。
著作権について – ユーザーが送信した Glassdoor レビューおよびその他のデータは著作権で保護されています。サイトのコンテンツをそのまま大量に複製しないでください。
レート制限 – Glassdoor によって適用されるレート制限を尊重し、過剰な数のリクエストでサーバーに過負荷をかけないようにしてください。
使用事例 – Glassdoor データを従業員への嫌がらせや差別などの非倫理的な目的に利用しないでください。
これらの原則に従うことで、スクレーパーが法律の正しい側に留まることが保証されます。
まとめ
このガイドでは、Python を使用して Glassdoor から企業データを収集するための次のようなさまざまな戦略と手法を検討しました。
- GraphQL API データを解析して、概要情報、求人情報、給与、レビュー、面接の質問、写真を抽出します。
- 総数からページネーションページを計算し、すべてのページを体系的にスクレイピングする
- プロキシや ScraperAPI などのサービスを使用した Glassdoor のアンチスクレイピング システムの処理
- ToS、プライバシー、著作権、レート制限を尊重することで法的コンプライアンスを確保します
ここで説明した方法は、強力かつ倫理的な方法で有用なデータを大規模に収集する強力な Glassdoor スクレーパーを構築するために適用できます。
ハッピースクレイピング!