LinkedInをスクレイピングする方法:2024年版ガイド

人材の発掘やキャリアパスの分析から、投資に適した企業の特定、新しい市場における競争環境のマッピング、顧客関係管理(CRM)エンリッチメントの実施まで。LinkedInのデータポイントは、企業がビジネスを行うためにより的を絞った効果的なアプローチを構築する上で重要です
7 min read
How to scrape LinkedIn
  1. PythonでLinkedInをスクレイピングする
  2. LinkedInをスクレイピングする際に考慮すべきこと

簡単に言えば、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構造をより良く理解するには、以下の手順に従ってください。

  1. LinkedInのWebサイトにアクセスして、アカウントにサインインします。
  2. 上部ナビゲーションバーの求人アイコンをクリックします。任意の職種(:フロントエンド開発者)を入力してEnterを押します。
  3. リスト内の求人を右クリックし、検証をクリックして、ブラウザの開発者ツールを開きます。
  4. HTML構造を分析して、スクレイピングしたいデータを含むタグと属性を特定します。
LinkedInスクレイパー

求人情報のスクレイピング

まず、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__itemli要素を検索しています。この要素はコースリストを収めています。各コースのタイトル、作成者、長さ、リンクを抽出して出力します。最初のリクエストが失敗した場合、エラーメッセージを出力します。

次のコマンドを使用してシェルまたはターミナルからコードを実行します。

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-entitiesdiv要素を検索しています。この要素は記事リストを収めています。各記事のタイトル、説明、リンクを抽出して出力します。最初のリクエストが失敗すると、失敗メッセージが出力されます。

次のコマンドを使用してシェルまたはターミナルからコードを実行します。

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.txtLinkedInの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_USERNAMEYOUR_BRIGHTDATA_PASSWORDYOUR_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データ)を選択してください:

LinkedIn人物プロフィールデータセット(公開Webデータ):

フィルターを適用して選択肢をさらに絞り込み、希望条件を満たす特定のデータを取得し、[購入オプション] をクリックすると料金を確認できます。

料金は選択したレコード数で決まるため、ニーズと予算に応じて購入レコード数を調整できます。これらのデータセットを購入することで、データの抽出と収集の手間を省いてワークフローを大幅に簡素化できます:

データの抽出と収集

まとめ

この記事では、Pythonを使用してLinkedInからデータを手作業でスクレイピングする方法を説明し、データスクレイピングプロセスを簡素化および迅速化するソリューションであるBright Dataを紹介しました。市場調査、人材獲得、競合分析のいずれの目的でデータを収集する場合でも、これらのツールと手法は必要な情報を収集するのに役立ちます。

手作業によるスクレイピングは強力なツールですが、Bright Dataはよりシンプルで効率的な代替手段を提供できることを覚えておいてください。スクレイピングブラウザとあらかじめスクレイピングされたLinkedInデータセットにより、Bright Dataは時間と労力を節約し、あなたは本当に重要なこと、つまりデータを使用して情報に基づいた意思決定を行うことに集中できます。Bright Dataのデータエキスパートに相談すれば最適なソリューションが見つかります。