簡単に言えば、WebスクレイピングとはWebで入手可能な情報を収集するプロセスを自動化し、それを保存、分析、または意思決定プロセスに活用することです。
さて、なぜLinkedInなのか疑問に思われるかもしれません。プロフェッショナルのネットワーキングプラットフォームであるLinkedInはデータの宝庫なのです。プロフェッショナル、企業、雇用機会に関する豊富な情報を掲載しています。LinkedInを使うことで、例えば採用担当者は潜在的な候補者を見つけ、営業チームは潜在的な見込み客を特定し、研究者は労働市場を分析できます。その可能性は無限です。
このチュートリアルでは、Beautiful Soupを使ってLinkedInからデータをスクレイピングする方法を説明します。ステップごとの手順を説明した後、LinkedInのスクレイピングを大幅に高速化するBright Dataソリューションについても説明します。
PythonでLinkedInをスクレイピングする
このチュートリアルでは、Pythonを使用してBeautiful SoupやRequestsなどの無料のツールを使ったWebスクレイパーを作成します。それでは始めましょう!
注:本チュートリアルは教育を意図しており、技術的可能性を示すことのみを目的としています。LinkedInの利用規約によると、LinkedInからデータをスクレイピングすることは固く禁じられています。この情報を悪用してLinkedInをスクレイピングすると、LinkedInアカウントの使用が永久に禁止されたり、法的措置が取られる可能性があります。ご自身の責任と判断で行動してください。
始める前に、システムにPythonバージョン3.7.9以上がインストールされていることを確認してください。
Pythonをインストールしたら、次はWebスクレイピングに必要なライブラリをセットアップします。ここでは、requests
でHTTPリクエストを行い、Beautiful Soup
(BS4)でHTMLコンテンツを解析し、Playwright
でブラウザインタラクションとタスクの自動化を行います。シェルまたはターミナルを開き、以下のコマンドを実行します:
pip3 install beautifulsoup4
pip3 install requests
pip3 install playwright
LinkedInの構造とデータオブジェクト
LinkedInのスクレイピングを始める前に、以下のセクションではサイトの構造について説明し、抽出するデータオブジェクトを特定します。このチュートリアルでは求人情報、ユーザープロフィール、記事、会社情報のスクレイピングに焦点を当てます:
- 求人情報には職種、会社、場所、職務内容などの詳細が含まれます。
- コース情報にはコース名、インストラクター、長さ、説明が含まれます。
- 企業データには会社名、業種、規模、場所、説明が含まれます。
- 記事はプロフェッショナルによって執筆されており、プロフェッショナルとしての成長や業界の洞察などのトピックが取り上げられています。
例えばLinkedInの求人ページのHTML構造をより良く理解するには、以下の手順に従ってください。
- LinkedInのWebサイトにアクセスして、アカウントにサインインします。
- 上部ナビゲーションバーの求人アイコンをクリックします。任意の職種(例:フロントエンド開発者)を入力してEnterを押します。
- リスト内の求人を右クリックし、検証をクリックして、ブラウザの開発者ツールを開きます。
- HTML構造を分析して、スクレイピングしたいデータを含むタグと属性を特定します。
求人情報のスクレイピング
まず、LinkedInから求人情報をスクレイピングすることから始めましょう。requests
を使用してページのHTMLコンテンツを取得し、Beautiful Soup
を使用して関連情報を解析・抽出します。
scraper_linkedIn_jobs.py
という名前のファイルを新規作成し、以下のコードを追加します:
import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/jobs/search?keywords=Frontend%20Developer&location=United%20States&pageNum=0'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
job_listings = soup.find_all('div', {'class':'job-search-card'})
for job in job_listings:
title = job.find('h3', {'class': 'base-search-card__title'}).text.strip()
company = job.find('a', {'class': 'hidden-nested-link'}).text.strip()
location = job.find('span', {'class': 'job-search-card__location'}).text.strip()
anchor_tag = job.find('a', class_='base-card__full-link')
href_link = anchor_tag['href']
print(f"Title: {title}\nCompany: {company}\nLocation: {location}\nJob Link: {href_link}\n")
else:
print("Failed to fetch job listings.")
このコードは、LinkedInの検索ページから米国内のフロントエンド開発者の求人情報を取得します。
注:ここで定義する
url
では、URLパラメーターを使用して求人検索を好みに合わせてカスタマイズできます。例えば、location=United%20States
を変更すると別の国の求人情報を検索できます。同様に、keywords=Frontend%20Developer
を別の職種に変更するなど、さまざまなキーワードで求人を検索できます。さらに、「pageNum=0」を変更して検索結果のページを移動すると、より多くの求人情報を探すことができます。これらのパラメータにより、希望する条件や好みに合わせて柔軟に求人検索を調整できます。
次のコマンドを使用してシェルまたはターミナルからコードを実行します。
python3 scraper_linkedIn_jobs.py
職種、会社、場所、求人へのリンクを収めた求人リストを取得できます。結果は以下のようになります:
…output omitted…
Title: Frontend Engineer
Company: Klarity
Location: San Francisco, CA
Job Link: https://www.linkedin.com/jobs/view/desenvolvedor-front-end-at-pasquali-solution-3671519424?refId=JN%2FeM862Wu7qnbJd96Eoww%3D%3D&trackingId=kTSLczKp1q4aurZ5rSzRPQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card
Title: Front-End Developer (Remote)
Company: Prevail Legal
Location: United States
Job Link: https://www.linkedin.com/jobs/view/desenvolvedor-front-end-at-pasquali-solution-3671519424?refId=JN%2FeM862Wu7qnbJd96Eoww%3D%3D&trackingId=kTSLczKp1q4aurZ5rSzRPQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card
…output omitted…
LinkedInラーニングのスクレイピング
求人情報のスクレイピングだけでなく、LinkedInラーニングページからコースをスクレイピングすることもできます。
scraper_linkedIn_courses.py
という名前のファイルを新規作成し、以下のコードを追加します:
import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/learning/search?trk=content-hub-home-page_guest_nav_menu_learning'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
course_listings = soup.find_all('li', {'class':'results-list__item'})
for course in course_listings:
title = course.find('h3', {'class': 'base-search-card__title'}).text.strip()
created_by = course.find('h4', {'class': 'base-search-card__subtitle'}).text.strip()
duration = course.find('div', {'class': 'search-entity-media__duration'}).text.strip()
# Find the anchor tag containing the link
anchor_tag = course.find('a', class_='base-card__full-link')
# Extract the 'href' attribute value
if anchor_tag:
href_link = anchor_tag['href']
else:
print("Anchor tag not found.")
print(f"Title: {title}\nCreated By: {created_by}\nDuration: {duration}\nCourse Link: {href_link}\n")
else:
print("Failed to fetch course listings.")
ここでは、requests
を使用して LinkedInラーニングページにアクセスし、Beautiful Soup
を使用して解析しています。クラスresults-list__item
のli
要素を検索しています。この要素はコースリストを収めています。各コースのタイトル、作成者、長さ、リンクを抽出して出力します。最初のリクエストが失敗した場合、エラーメッセージを出力します。
次のコマンドを使用してシェルまたはターミナルからコードを実行します。
python3 scraper_linkedIn_courses.py
コースのタイトル、作成者、リンクを収めたコースのリストを取得します。以下のような結果が得られます:
…output omitted…
Title: Define general intelligence
Created By: From: Introduction to Artificial Intelligence
Duration: 3m
Course Link: https://www.linkedin.com/learning/introduction-to-artificial-intelligence/define-general-intelligence?trk=learning-serp_learning-search-card_search-card
Title: Shortcut menus and the Mini toolbar
Created By: From: Excel Essential Training (Microsoft 365)
Duration: 4m
Course Link: https://www.linkedin.com/learning/excel-essential-training-microsoft-365-17231101/shortcut-menus-and-the-mini-toolbar?trk=learning-serp_learning-search-card_search-card
Title: Learning Excel: Data Analysis
Created By: By: Curt Frye
Duration: 3h 16m
Course Link: https://www.linkedin.com/learning/learning-excel-data-analysis-18868618?trk=learning-serp_learning-search-card_search-card
…output omitted…
LinkedInの記事のスクレイピング
LinkedInの記事ページから記事データをスクレイピングすることもできます。
そのためには、scraper_linkedIn_articles.py
という名前のファイルを新規作成し、以下のコードを追加します。
import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/pulse/topics/home/?trk=guest_homepage-basic_guest_nav_menu_articles'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
article_listings = soup.find_all('div', {'class':'content-hub-entities'})
for article in article_listings:
title = article.find('h2', {'class': 'break-words'}).text.strip()
description = article.find('p', {'class': 'content-description'}).text.strip()
# Find the anchor tag containing the link
anchor_tag = article.find('a', class_='min-w-0')
# Extract the 'href' attribute value
if anchor_tag:
href_link = anchor_tag['href']
else:
print("Anchor tag not found.")
print(f"Title: {title}\nDescription: {description}\nArticle Link: {href_link}\n")
else:
print("Failed to fetch article listings.")
このコードでは、requests
を使用してLinkedInのページを取得し、Beautiful Soup
を使用してページを解析しています。クラスcontent-hub-entities
のdiv
要素を検索しています。この要素は記事リストを収めています。各記事のタイトル、説明、リンクを抽出して出力します。最初のリクエストが失敗すると、失敗メッセージが出力されます。
次のコマンドを使用してシェルまたはターミナルからコードを実行します。
python3 scraper_linkedIn_articles.py
タイトル、説明、リンクを収めた記事のリストを取得します。結果は以下のようになります:
…output omitted…
Title: What are some of the emerging leadership trends and theories that you should be aware of?
Description: Learn about the six emerging leadership styles and frameworks that can help you develop your leadership skills and potential in a changing and complex world.
Article Link: https://www.linkedin.com/advice/1/what-some-emerging-leadership-trends-theories
Title: What are the most effective strategies for handling a leadership transition?
Description: Learn six strategies to manage a leadership transition smoothly and successfully, from assessing the situation to planning for the future.
Article Link: https://www.linkedin.com/advice/0/what-most-effective-strategies-handling
Title: How do you combine quality assurance training with other learning initiatives?
Description: Learn some strategies and tips for integrating quality assurance training with other learning objectives and methods in your organization.
Article Link: https://www.linkedin.com/advice/0/how-do-you-combine-quality-assurance-training
…output omitted…
このチュートリアルで使用されたコードは、全てこちらのGitHubリポジトリからダウンロードできます。
LinkedInをスクレイピングする際に考慮すべきこと
LinkedInは、他の多くのWebサイトと同様に、データの自動スクレイピングを防ぐためにいくつかの手法を採用しています。それらの手法を理解することで回避することが可能となり、スクレイピングを成功させることが可能となります:
- ページネーション:LinkedInは検索結果をページに分割して表示します。スクレイピングのスクリプトがページネーションを処理して、関連データをすべて取得することが必要です。
- 広告:LinkedInはさまざまなセクションに広告を表示します。スクレイピングのスクリプトが実際のデータのみを対象とし、広告コンテンツを抽出しないようにする必要があります。
- レート制限:LinkedIn は、一定時間内に同じIPアドレスから送信されるリクエストの数を監視しています。リクエストの数が一定の制限値を超えると、LinkedInはそのIPアドレスを一時的または恒久的にブロックすることがあります。
- CAPTCHA:LinkedInは特定のIPアドレスから異常なアクティビティを検出した場合、CAPTCHAチャレンジを要求することがあります。CAPTCHA認証は、人間にとっては容易にパスできるがボットにとっては困難なように設計されており、自動スクレイピングを防ぎます。
- ログイン要求:LinkedInの一部のデータは、ログインしていないとアクセスできません (ユーザープロフィール、企業ページなど)。つまり、このデータをスクレイピングしようとすると自動ログインが必要になり、LinkedInはそれを検出してブロックできます。
- 動的コンテンツ:LinkedInはJavaScriptを使用して一部のコンテンツを動的に読み込みます。これにより、ページが最初に読み込まれたときにHTMLにデータが存在しない場合があるため、スクレイピングが難しくなります。
robots.txt
:LinkedInのrobots.txt
ファイルは、サイト内でWebクローラーがアクセスできる部分を指定しています。厳密には防止のための手法ではありませんが、このファイル内の指示を無視するとIPがブロックされる可能性があります。
これらの手法を回避することは技術的には可能ですが、そうすることでLinkedInの利用規約に違反し、アカウントが使用禁止となる可能性があることは忘れないでください。あなたが実行するスクレイピングが常に合法かつ倫理的であるように心がけましょう。
より良い選択肢:LinkedInのスクレイピングにBright Dataを使う
手作業によるWebスクレイピングは小規模なデータ抽出には有効ですが、大規模になると時間がかかり、非効率になります。Bright Dataは、LinkedInの膨大なデータに簡単にアクセスできる、よりシンプルで効率的な手段を提供します。
Bright DataはWebスクレイピング用に主に2つの製品を提供しています:
- スクレイピングブラウザ:スクレイピングブラウザ はブラウザベースのソリューションで、通常のユーザーと同じようにWebサイトを見て回ることができます。JavaScriptレンダリング、AJAXリクエスト、その他の複雑な処理に対応しており、LinkedInのような動的なWebサイトのスクレイピングに理想的です。
- LinkedInデータセット:LinkedIn データセットは、求人情報、ユーザープロフィール、会社情報などのLinkedInデータを収めた、あらかじめ収集され構造化されたデータセットです。Bright Dataプラットフォームからデータに直接アクセスしてダウンロードできます。
Bright Dataアカウントのセットアップ
Bright Dataプラットフォーム上のLinkedInデータセットへのアクセスは、以下の手順で行います:
Bright DataのWebサイトで無料トライアルを開始をクリックし、指示に従ってアカウントを作成します。
ログイン後、左側のナビゲーションパネルにあるクレジットカードアイコンをクリックして請求ページに移動します。次に、支払い方法を追加してアカウントを有効にします:
次に、ピンアイコンをクリックしてプロキシとスクレイピングインフラストラクチャページを開きます。スクレイピングブラウザを選択 > [始める]を選択します:
ソリューションに名前を付けて追加ボタンをクリックします:
アクセスパラメーターを選択し、ユーザー名、ホスト、パスワードを書きとめておきます。次のステップで必要になります:
これらのステップがすべて完了したら、次のセクションに進みます。
スクレイピングブラウザを使用してLinkedIn企業データをスクレイピングする
LinkedInの企業ページから企業データを取得するには、scraper_linkedIn_bdata_company.py
という名前のファイルを新規作成し、以下のコードを追加します:
import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
username='YOUR_BRIGHTDATA_USERNAME'
password='YOUR_BRIGHTDATA_PASSWORD'
auth=f'{username}:{password}'
host = 'YOUR_BRIGHTDATA_HOST'
browser_url = f'wss://{auth}@{host}'
async def main():
async with async_playwright() as pw:
print('connecting')
browser = await pw.chromium.connect_over_cdp(browser_url)
print('connected')
page = await browser.new_page()
print('goto')
await page.goto('https://www.linkedin.com/company/spacex/', timeout=120000)
print('done, evaluating')
# Get the entire HTML content
html_content = await page.evaluate('()=>document.documentElement.outerHTML')
# Parse the HTML with Beautiful Soup
soup = BeautifulSoup(html_content, 'html.parser')
# Extract the 'About us' description
description_element = soup.select_one('.core-section-container[data-test-id="about-us"] p[data-test-id="about-us__description"]')
description = description_element.text if description_element else None
print('Description:')
print(description)
# Extract the 'Company size'
company_size_element = soup.select_one('div[data-test-id="about-us__size"] dd')
company_size = company_size_element.text.strip() if company_size_element else None
print('Company size:')
print(company_size)
await browser.close()
# Run the async function
asyncio.run(main())
このコードでは、ブラウザの自動化にPlaywrightを使用しています。プロキシ経由でChromiumブラウザに接続し、SpaceXの企業ページに移動して、会社概要の説明と企業規模を抽出します。
HTMLコンテンツを取得するには、Playwright の評価メソッドを使用し、それを Beautiful Soupで解析して特定の要素を見つけ、抽出された情報を出力します。Playwright の非同期機能を活用するにはmain()
という非同期関数を定義し、asyncio.run(main ())
でスクリプトの実行を開始します。
注:
YOUR_BRIGHTDATA_USERNAME
、YOUR_BRIGHTDATA_PASSWORD
、YOUR_BRIGHTDATA_HOST
は実際のBright Dataログイン情報で置き換えます。この手順は、アカウントを正常に認証してアクセスするために重要です。
シェルまたはターミナルを開き、下のコマンドでコードを実行します。
python3 scraper_linkedIn_bdata_company.py
次のような出力が得られるはずです:
…output omitted…
Description:
SpaceX designs, manufactures and launches the world's most advanced rockets and spacecraft. The company was founded in 2002 by Elon Musk to revolutionize space transportation, with the ultimate goal of making life multiplanetary.
SpaceX has gained worldwide attention for a series of historic milestones. It is the only private company ever to return a spacecraft from low-Earth orbit, which it first accomplished in December 2010. The company made history again in May 2012 when its Dragon spacecraft attached to the International Space Station, exchanged cargo payloads, and returned safely to Earth — a technically challenging feat previously accomplished only by governments. Since then Dragon has delivered cargo to and from the space station multiple times, providing regular cargo resupply missions for NASA.
For more information, visit www.spacex.com.
Company size:
1,001-5,000 employees
LinkedInのスクレイピングに使用した最初のアプローチは、ポップアップやreCAPTCHAなどの課題に直面する可能性があり、コードがブロックされるかもしれません。しかし、Bright Dataのスクレイピングブラウザを活用することで、これらの障害を克服し、中断のないスクレイピングが可能になります。
Bright Data LinkedInデータセット
LinkedInからデータを手作業でスクレイピングする代わりに、LinkedInデータセットを購入する方法もあります。これにより、ユーザープロフィールや追加情報などの貴重な個人データにアクセスできます。Bright Data LinkedInデータセットを使用すると、手動でWebスクレイピングを行う必要がなくなり、時間を節約でき、構造化されたデータをすぐに分析できます。
利用可能なデータセットを確認するには、Bright Dataのダッシュボードに移動し、左側のナビゲーションバーからデータセットとWebスクレイパーIDEをクリックし、LinkedIn人物プロフィールデータセット(公開Webデータ)を選択してください:
フィルターを適用して選択肢をさらに絞り込み、希望条件を満たす特定のデータを取得し、[購入オプション] をクリックすると料金を確認できます。
料金は選択したレコード数で決まるため、ニーズと予算に応じて購入レコード数を調整できます。これらのデータセットを購入することで、データの抽出と収集の手間を省いてワークフローを大幅に簡素化できます:
まとめ
この記事では、Pythonを使用してLinkedInからデータを手作業でスクレイピングする方法を説明し、データスクレイピングプロセスを簡素化および迅速化するソリューションであるBright Dataを紹介しました。市場調査、人材獲得、競合分析のいずれの目的でデータを収集する場合でも、これらのツールと手法は必要な情報を収集するのに役立ちます。
手作業によるスクレイピングは強力なツールですが、Bright Dataはよりシンプルで効率的な代替手段を提供できることを覚えておいてください。スクレイピングブラウザとあらかじめスクレイピングされたLinkedInデータセットにより、Bright Dataは時間と労力を節約し、あなたは本当に重要なこと、つまりデータを使用して情報に基づいた意思決定を行うことに集中できます。Bright Dataのデータエキスパートに相談すれば最適なソリューションが見つかります。
クレジットカードは必要ありません