ソーシャルメディアデータをスクレイピングする方法 – 2023年版ガイド

このガイドでは、ウェブスクレイピング用の強力なツールであるPythonを使用して、ソーシャルメディアデータをスクレイピングする方法を説明します。
4 min read
How to scrape social media

特にソーシャルメディアプラットフォームは、市場調査、競合分析、評判管理、顧客サービスの取り組みに活用できる情報を豊富に提供しています。ウェブスクレイピングを通じてこれらのデータを活用することで、企業は情報に基づいた意思決定を行い、ブランドの評価を高め、市場での競争力を獲得できます。

ウェブスクレイピングを使用すると、ウェブページを効率的に移動して特定のデータを選択し、CSVやJSONファイルなどの構造化された形式で抽出できます。

このガイドでは、Pythonを使用して複数のプラットフォームからソーシャルメディアデータをスクレイピングする方法を説明します。Pythonは、さまざまな種類のデータの解析、抽出、照合を容易にする豊富なライブラリを備えているため、ウェブスクレイピングの強力なツールとして広く認められています。  

Pythonを使用してソーシャルメディアをスクレイピングする

このチュートリアルを始める前に、以下のものが必要です。

  • Python: このチュートリアルで使用するプログラミング言語。
  • pip: Python用のパッケージマネージャー。Python固有のライブラリを入手するのに役立ちます。
  • Beautiful Soup: HTMLやXMLファイルからデータを解析・抽出するための便利なPythonパッケージ。ダウンロードの方法は、このドキュメントに記載されています。
  • Selenium: ウェブブラウザ上で操作を実行するためのフレームワーク。これは、実際のブラウザをシミュレートするのに特に役立ち、動的なウェブサイトやJavaScriptを使用したウェブサイトのレンダリングや解析を可能にします。Seleniumのインストール方法については、公式ドキュメントを参照して下さい。

このチュートリアルでは、これらのパッケージをインストールしてPythonの環境を整えてから、Python実行可能ファイルを実行してインターネットをスクレイピングします。ただし、問題は、FacebookやInstagramなどのソーシャルメディアプラットフォームには、しばしばスクレイピングボットをブロックするブロッカーが存在することです。これには、ログイン認証の要件があること、有用なデータをボタンや動的コンテンツの背後に隠すこと、データの表示にJavaScriptを使用することなどが含まれます。Seleniumを利用してこれらの対策を回避し、スクレイピングを公開ページに限定することで、ログイン認証の必要性を低減します。

このチュートリアルのコードすべては、このGitHubリポジトリから入手できます。

Pythonを使用してFacebookをスクレイピングする

ウェブスクレイピングの最初のステップは、解析する必要のあるページを探索することです。必要なデータ、ボットが通過するパス、求めるデータの具体的なセレクタを正確に特定する必要があります。

例えば、トム・クルーズのFacebook公開プロフィールを見ると、彼に関する情報、彼の他のページへのリンク、映画を宣伝する彼の投稿、およびそれらに関連するさまざまなメディアが表示されます。このページに表示されるすべての情報にアクセスしてスクレイピングできます。

トム・クルーズの投稿のコンテンツをスクレイピングするには、興味のある投稿で共有されているセレクタがないか、ページを検査する必要があります。

必要なデータを分離するセレクタが見つかったら、スクレイピングコードを書き始めることができます。Pythonファイル(.py)を開き、使用するパッケージをインポートします。SeleniumでHTMLページのコンテンツにアクセスし、Beautiful Soupで特定のデータを解析して抽出し、pandasで最終データセットの構造化とクリーニングを行います。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd

次に、スクレイピングしたいページを定義し、Seleniumにオプションを追加して実際のユーザーを模倣し、クローラーがブロックされるのを回避します。


# Define the URL you want to scrape
url = 'https://www.facebook.com/officialtomcruise/'

# Define the options for the Chrome webdriver
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')

# Create a new instance of the Chrome webdriver with the defined options
driver = webdriver.Chrome(options=options)

# Load the Facebook page in the webdriver
driver.get(url)

この時点で、ページ全体の抽出が完了しています。ただし、人間が読める形式にはなっていません。これを変更するには、Beautiful Soupを活用し、以前に分離したセレクタを使って必要なテキストを抽出します。

# Extract the HTML content of the page using BeautifulSoup
html_content = driver.page_source
soup = BeautifulSoup(html_content, 'html.parser')

posts = soup.find_all('div', class_='x1l90r2v') 

# Extract the text content of each post
post_content = [post.text for post in posts]

# Save the scraped data in a CSV file
data = pd.DataFrame({'post_content': post_content})
data.to_csv('facebook_posts.csv', index=False)

# Print the scraped data
print(data)


# Close the webdriver
driver.quit()

必要なデータを分離したら、それをDataFrameとして構造化できます(または自分に合った構造にします)。DataFrameは、データの表形式ビューを提供するため、一般的に使用されるデータ構造です。

Pythonを使用してTwitterをスクレイピングする

Facebookをスクレイピングしたところで、同じプロセスを使ってTwitterをスクレイピングします。

トム・クルーズのTwitterページを探索し、欲しいデータに使えるセレクタを分離します。

例えば、この例では、彼の全ツイートのテキストをスクレイピングします。ウェブサイトのコードを見ると、data-testid = tweetTextという属性があり、これを利用することで効率的に抽出できます。

ウェブサイトのさまざまな動作に遭遇する可能性があることに留意することは重要です。例えば、Twitterは、JavaScriptを利用して無限スクロール機能を実装しています。つまり、ページを下にスクロールするとさらに多くのデータが表示され、ページが読み込まれた直後にコンテンツをスクレイピングしようとすると、必要なデータをすべて取得できなかったり、例外が発生したりする可能性があります。

この問題を解決するために、ボットがコンテンツをスクレイピングする前に一定時間待つように設定するか、必要なデータすべてを取得できるようにページを十分にスクロールします。

Pythonファイルを再度作成し、以下のコードを使用して目的のコンテンツをスクレイピングします。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.common.by import By
import time 

# Define the URL you want to scrape
url = 'https://twitter.com/TomCruise'

# Define the options for the Chrome webdriver to mimic a real page
options = Options()
options.add_argument('--headless')
options.add_argument("--incognito")
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')
options.add_argument("--enable-javascript")

# Create a new instance of the Chrome webdriver with the defined options
driver = webdriver.Chrome(options=options)

# Load the Twitter page in the webdriver
driver.get(url)

# Wait for tweets to populate the page
try:
    WebDriverWait(driver, 60).until(expected_conditions.presence_of_element_located(
        (By.CSS_SELECTOR, '[data-testid="tweet"]')))
except WebDriverException:
    print("Something happened. No tweets loaded")

# scroll a bit for more tweets to appear
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(10)

# Extract the HTML content of the page using BeautifulSoup
html_content = driver.page_source
soup = BeautifulSoup(html_content, 'html.parser')

posts = soup.find_all(attrs={"data-testid": "tweetText"})

# Extract the text content of each post
post_content = [post.text for post in posts]

# Save the scraped data in a CSV file
data = pd.DataFrame({'post_content': post_content})
data.to_csv('twitter_posts.csv', index=False)

# Print the scraped data
print(data)

# Close the webdriver
driver.quit()

Pythonを使用してInstagramをスクレイピングする

最後に、Instagramをスクレイピングする方法を説明します。

トム・クルーズのInstagramページは、ログインしていない場合は写真と動画のみが表示されるメディアギャラリーとして表示されます。ただし、ページを探索すると、ほとんどの場合、メディアの代替テキストに投稿コンテンツも含まれていることがわかります。つまり、このページからメディアファイルのURLとその代替説明を直接スクレイピングできるのです。

そのために必要なことは、データのセレクタを見つけ、データを収集するためのDataFrameを構築するだけです。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd
# Define the URL you want to scrape
url = 'https://www.instagram.com/tomcruise'

# Define the options for the Chrome webdriver
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')

# Create a new instance of the Chrome webdriver with the defined options
driver = webdriver.Chrome(options=options)

# Load the Instagram page in the webdriver
driver.get(url)

# Extract the HTML content of the page using BeautifulSoup
html_content = driver.page_source
soup = BeautifulSoup(html_content, 'html.parser')

# Collect instagram links
links = soup.find_all('a', href= True) 

# Limit the collected links to posts data

posts = []
for i in links :
    if '/p/' in i:
        posts.append(i)

# Save the scraped data in a CSV file
data = pd.DataFrame({'post_links': posts})
data.to_csv('instagram_posts.csv', index=False)

# Print the scraped data
print(data)

# Close the webdriver
driver.quit()

Bright Dataを使用してソーシャルメディアをウェブスクレイピングする

ウェブスクレイピングは時間のかかる、面倒な作業になることがありますが、必ずしもそうである必要はありません。

Bright Dataは、ウェブで公開されている大量の構造化データに、企業が簡単にアクセスできるようにするウェブプラットフォームです。この収集・整理されたデータは、ソーシャルメディアデータセットの形式ですぐに利用できます。これらのデータセットには、ユーザーのプロフィール、投稿、コメントなど、大量のデータが含まれており、自分でデータをスクレイピングしなくてもアクセスできます。  

さらに、他の場所からデータを取得したい場合は、Bright DataのWeb Scraper IDEWeb Unlockerツールが役に立ちます。これらには、作成する必要があるコードの量を減らすための構築済みテンプレートが付属しており、また、リージョンロックされたコンテンツにアクセスし、CAPTCHAを解決するのに役立つ組み込みプロキシを備えています。  

ソーシャルメディアデータのスクレイピングにBright Dataを利用することは、自分でスクレイピングするよりも効率的で確実な選択肢となり得ます。さらに、Bright Dataは広大なプロキシネットワークを提供しているため、ソーシャルメディアプラットフォームをスクレイピングする際にレート制限を回避し、IPブロックを防ぐことができます。  

まとめ  

この記事では、ウェブスクレイピングの基礎について解説し、Pythonを活用してFacebook、Twitter、Instagramなどのプラットフォームからソーシャルメディアデータを抽出する方法を説明しました。また、ソーシャルメディアのウェブサイトを手動でスクレイピングする際に考慮すべき重要な要素を検討し、ウェブスクレイピング、特にソーシャルメディアデータ抽出のソリューションとしてBright Dataを検討しました。

ウェブスクレイピングで収集したソーシャルメディアデータは、マーケティングリサーチ、センチメント分析、トレンド分析に利用できます。ただし、ウェブスクレイピングを倫理的に利用し、スクレイピングを行うウェブサイトやソーシャルメディアネットワークの利用規約に従う必要があります。スクレイピングするデータが公開されており、プライバシー法に違反していないことを確認してください。Bright Dataが提供するツールは、データスクレイピングに関わる法的・倫理的な問題を回避するのに役立つため、特に有用です。

More from Bright Data

Datasets Icon
Get immediately structured data
Access reliable public web data for any use case. The datasets can be downloaded or delivered in a variety of formats. Subscribe to get fresh records of your preferred dataset based on a pre-defined schedule.
Web scraper IDE Icon
Build reliable web scrapers. Fast.
Build scrapers in a cloud environment with code templates and functions that speed up the development. This solution is based on Bright Data’s Web Unlocker and proxy infrastructure making it easy to scale and never get blocked.
Web Unlocker Icon
Implement an automated unlocking solution
Boost the unblocking process with fingerprint management, CAPTCHA-solving, and IP rotation. Any scraper, written in any language, can integrate it via a regular proxy interface.

Ready to get started?