Jupyter NotebookでWebスクレイピングを行う方法

Jupyter Notebookが、いかにしてインタラクティブコーディングやデータ分析、可視化によりWebスクレイピングの簡素化を実現するかを学びましょう。
3 min read
Web Scraping With Jupyter Notebooks blog image

このガイドでは、次のことについて学ぶことができます。

  • Jupyter Notebookとは何か
  • Jupyter NotebookをWebスクレイピングに使用すべき理由
  • ステップ・バイ・ステップチュートリアルでの使用方法
  • オンラインデータのスクレイピング時におけるJupyter Notebookのユースケース

さっそく始めましょう!

Jupyter Notebookとは

Jupyterにおいて、 ノートブック とは、「コンピューターコードや、わかりやすい言葉による説明、データ、チャート、グラフ、図、およびインタラクティブコントロールを組み合わせた共有可能なドキュメント」を意味します。

ノートブックは、コードのプロトタイプ作成および説明、データの調査および可視化、そしてアイディア共有のためのインタラクティブな環境を提供します。特に、 Jupyter Notebookアプリ で作成されたノートブックは、Jupyter Notebookと呼ばれます。

Jupyter Notebookアプリは、Webブラウザ経由で ノートブックドキュメント を編集および実行可能にするサーバークライアントアプリケーションです。これは、ローカルデスクトップで実行することも、リモートサーバーにインストールすることもできます。

Jupyter Notebookアプリのインターフェイス

Jupyter Notebookは、Notebookドキュメントに含まれるコードを実行する「計算エンジン」、いわゆる「カーネル」を提供します。具体的には、 ipython カーネルはPythonコードの実行を行います(ただし、他言語のカーネルも存在します)。

ipythonカーネル経由で新規ドキュメントを起動する方法

Jupyter Notebookアプリには、ローカルファイルや既存のノートブックドキュメントの表示、ドキュメントにおけるカーネルの管理など、一般的な操作をサポートするダッシュボードがあります。

Jupyter Notebookのダッシュボード

Jupyter NotebookをWebスクレイピングに使用すべき理由

Jupyter Notebookは、データ分析および研究開発のために特別に設計されており、次の理由からWebスクレイピングに役立ちます。

  • インタラクティブ開発:セルと呼ばれる小規模で扱いやすいチャンクでコードを書き、実行します。各セルは他のセルから独立して機能します。これにより、テストとデバッグが簡単になります。
  • 組織:セルにてMarkdownを使用することにより、コードの文書化やロジックの説明、メモや指示の追加が可能です。
  • データ分析ツールとの統合:Jupyter Notebookは pandasや matplotlib、 seabornなどのライブラリと統合されているため、スクレイピング後はすぐにPythonにてデータのクリーニングや処理、分析を行うことが可能です。
  • 再現性と共有:Jupyter Notebookは .ipynb ファイル(標準形式)として簡単に共有したり、 ReST、Markdownなど、他の形式に変換したりすることができます。

メリットとデメリット

Jupyter Notebookをデータスクレイピングに使用するメリットおよびデメリットとしては、次のようなことが挙げられます。

👍メリット

  • ステップ・バイ・ステップデバッグ:各セルは個別に実行可能なため、データ抽出コードをさまざまなセルに分割して実行することができます。このため、セルを実行し、セルのレベルでバグをインターセプトすることで、コードの小規模チャンクをデバッグすることが可能となります。
  • 文書化:セルでMarkdownを使用することでファイルを作成し、スクレイピングコードの仕組みを文書化したり、行った選択のロジックを説明したりできます。
  • 柔軟性:Jupyter Notebookでは、Webスクレイピングやデータクリーニング、および分析を単一の環境にて行うことができます。これにより、スクレイピングスクリプトのIDEへの書き込みや、他の場所でのデータ分析など、さまざまな環境間の切り替えが可能となります。

👎デメリット

  • 大規模なプロジェクトに不適:Jupyter Notebookのドキュメントは長くなりがちです。そのため、大規模なデータスクレイピングプロジェクトには理想的でありません。
  • パフォーマンスの制限:大規模なデータセットの操作時や長いスクリプトの実行時には、ノートブックの動作が遅くなったり、応答しなくなったりする場合があります。詳細は、 Webスクレイピングを高速化させる方法をご覧ください。
  • 自動化に不適:スクレイパーをスケジュールに従って実行する必要がある場合や、大規模なシステムの一部としてデプロイする必要がある場合、Jupyter Notebookは最適な選択肢とはいえません。これらは、主にセルのインタラクティブな手動実行を想定して設計されているためです。

Jupyter Notebookを使用してWebスクレイピングを行う方法:ステップ・バイ・ステップチュートリアル

ここまで、Jupyter NotebookをWebスクレイピングに使用すべき理由を学びました。それでは、実際のスクレイピングにおける使用方法を学びましょう!

前提条件

このチュートリアルを複製するには、システムが次の前提条件を満たしている必要があります。

  • Python 3.6以降:Python 3.6以降のすべてのバージョンに対応。具体的には、3.4以降のPythonバージョンにインストール済みの pip を介し、依存関係をインストールします。

ステップ1:環境のセットアップと依存関係のインストール

例として、プロジェクトのメインフォルダを scraper/と呼ぶとします。このステップの完了時にフォルダは次のような構造になります。

scraper/
    ├── analysis.ipynb
    └── venv/

場所:

  • analysis.ipynb は、すべてのコードを含むJupyter Notebookです。
  • venv/ には仮想環境が含まれます。

venv/ 仮想環境ディレクトリは、次のように作成することができます。

python -m venv venv

アクティベートするには、Windowsで次を実行します。

venv\Scripts\activate

macOS/Linuxの場合、次を実行します。

source venv/bin/activate

アクティベートされた仮想環境で、このチュートリアルに必要なすべてのライブラリをインストールします。

pip install requests beautifulsoup4 pandas jupyter seaborn

これらのライブラリは以下の目的を果たします。

  • requests:HTTPリクエストの実行を行います。
  • beautifulsoup4:HTMLやXMLドキュメントの解析を行います。
  • pandas:CSVファイルやテーブルなどの構造化データを扱うのに適した、強力なデータ操作および分析ライブラリです。
  • jupyter:分析および可視化に適した、Pythonコードの実行および共有を行うためのWebベース、かつインタラクティブな開発環境です。
  • seaborn: MatplotlibをベースにしたPythonのデータ可視化ライブラリです。

 analysis.ipynb ファイルを作成するには、まず scraper/ フォルダに入る必要があります。

cd scraper

次に、このコマンドを使って新規Jupyter Notebookの初期化を行います。

jupyter notebook

これにより、 locahost8888からJupyter Notebookアプリにアクセスすることができるようになります。

「新規 > Python 3(”New > Python 3″)」オプションをクリックし、新規ファイルを作成します。

新規Jupyter Notebookファイルの作成

新規ファイルは、自動的に untitled.ipynbという名前になります。ダッシュボードから名前の変更が可能です。

Jupyter Notebookファイル名の変更

おめでとうございます!これにより、Jupyter NotebookでWebスクレイピングを行う準備が整いました。

ステップ2:ターゲットページの定義

このチュートリアルでは、ウェブサイト worldometerからデータの取得を行います。この場合におけるターゲットページは、 米国の年間二酸化炭素排出量 に関連するものであり、次のようなテーブル形式のデータを提供します。

米国の年間二酸化炭素排出量に関するテーブル形式のデータ

ステップ3:データの取得

次のように、ターゲットページからデータを取得してCSVファイルに保存することができます。

import requests
from bs4 import BeautifulSoup
import csv

# URL of the website
url = "https://www.worldometers.info/co2-emissions/us-co2-emissions/"

# Send a GET request to the website
response = requests.get(url)
response.raise_for_status() 

# Parse the HTML content
soup = BeautifulSoup(response.text, "html.parser")

# Locate the table
table = soup.find("table") 

# Extract table headers
headers = [header.text.strip() for header in table.find_all("th")]

# Extract table rows
rows = []
for row in table.find_all("tr")[1:]:  # Skip the header row
    cells = row.find_all("td")
    row_data = [cell.text.strip() for cell in cells]
    rows.append(row_data)

# Save the data to a CSV file
csv_file = "emissions.csv"
with open(csv_file, mode="w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(headers)  # Write headers
    writer.writerows(rows)    # Write rows

print(f"Data has been saved to {csv_file}")

コードは次のような動作を行います。

  • requests ライブラリを使用することで、 requests.get()メソッドを介してターゲットページにGETリクエストを送信し、 response.raise_for_status()メソッドを介してリクエストエラーを確認します。
  •  BeautifulSoup() クラスをインスタンス化し、 soup.find()メソッドで table セレクターを特定することにより、 BeautifulSoup を使用したHTMLコンテンツの解析を行います。この方法は、特にデータを含むテーブルを見つけるのに便利です。この構文に馴染みがない場合、 BeautifulSoupを使用したWebスクレイピングのガイドをお読みください。
  • テーブルのヘッダー抽出にリスト内包表記を使用します。
  • テーブルの全データ取得に for ループを使用し、ヘッダー行はスキップします。
  • 最後に、新規CVSファイルを開き、取得したすべてのデータを追加します。

このコードをセルに貼り付けて、 Shift+Enterを押すことにより、実行することができます。

もう1つの方法として、セルを選択してダッシュボードの「実行(”Run”)」ボタンを押すことで、セルを実行することができます。

Jupyter Notebookにおけるセルの実行

おめでとうございます。「データがemissions.csvに保存されました(”Data has been saved to emissions.csv”)」と表示され、データ抽出が正常に終了したことが通知されます。

ステップ4:データの正当性の確認

これで、データが正常にCVSファイルとして保存されたはずです。変換の際に問題が発生する場合があるため、CSVを開き、ファイルに問題がないことをご確認ください。このためには、新規セルに次のコードを入力します。

import pandas as pd

# Load the CSV file into a pandas DataFrame
csv_file = "emissions.csv"
df = pd.read_csv(csv_file)

# Print the DataFrame
df.head()

コードは次のことを行います。

  •  pandasのメソッド pd.read_csv()を使用し、CSVファイルをデータフレームとして開きます。
  • データフレームの最初の5行を df.head()メソッドで出力します。

この場合、次の結果が期待されます。

データフレームの最初の5 行

おめでとうございます!残っているのは、抽出されたデータを表示する目的によるものです。

ステップ5:データの可視化

これにより、希望するデータの分析が可能となります。例として、 seaborn を使用することで、過去数年間にわたる二酸化炭素排出量の傾向を示す折れ線グラフを作成することができます。これは、次のように実行することができます。

import seaborn as sns
import matplotlib.pyplot as plt

# Load the CSV file into a pandas DataFrame
csv_file = "emissions.csv"
df = pd.read_csv(csv_file)

# Clean column names be removing extra spaces
df.columns = df.columns.str.strip().str.replace('  ', ' ')

# Convert 'Fossil CO2 Emissions (tons)' to numeric
df['Fossil CO2 Emissions (tons)'] = df['Fossil CO2 Emissions (tons)'].str.replace(',', '').astype(float)

# Ensure the 'Year' column is numeric
df['Year'] = pd.to_numeric(df['Year'], errors='coerce')
df = df.sort_values(by='Year')

# Create the line plot
plt.figure(figsize=(10, 6))
sns.lineplot(data=df, x='Year', y='Fossil CO2 Emissions (tons)', marker='o')

# Add labels and title
plt.title('Trend of Fossil CO2 Emissions Over the Years', fontsize=16)
plt.xlabel('Year', fontsize=12)
plt.ylabel('Fossil CO2 Emissions (tons)', fontsize=12)
plt.grid(True)
plt.show()

コードは次のような動作を行います。

  • これは、 pandas を使用し、次のことを行います。
    • CSVファイルを開きます。
    • メソッド df.columns.str.strip().str.replace(' ', ' ') を使用し、余白を削除して列の名前を消去します(このメソッドを使用しないと、この例におけるコードではエラーが発生します)。
    • 「化石燃料由来の二酸化炭素排出量(トン)(”Fossil CO2 Emissions (tons)”)」列にアクセスし、 df['Fossil CO2 Emissions (tons)'].str.replace(',', '').astype(float)メソッドを使用してデータを数値に変換します。
    • 「年(”Years”)」列にアクセスし、 pd.to_numeric()メソッドを使用して値を数値に変換した後、 df.sort_values()メソッドを使用して値を昇順に並び替えます。
  •  matplotlib および seaborn ( matplotlib上に構築されているため、 seabornとともにインストールされます)ライブラリを使用し、実際のプロットを作成します。

この場合、次の結果が期待されます。

結果のプロット

おめでとうございます!Jupyter Notebookスクレイピングの持つ力がおわかりいただけましたでしょうか?

ステップ#6:仕上げ

Jupyter NotebookにおけるWebスクレイピングドキュメントの最終版は次のようになります。

Jupyter Notebookドキュメントの全体像

異なるブロックが存在し、各自の出力があることがわかります。

Webスクレイピング用Jupyter Notebookのユースケース

Webスクレイピング時におけるJupyter Notebookのユースケースについて考えましょう!

チュートリアル

Jupyter Notebookの各セルは個別に実行できるということを覚えておきましょう。Markdownのサポートが追加されたことで、このライブラリはステップ・バイ・ステップチュートリアルの作成に最適なツールになりました。

例として、コードを含むセルと、コードのロジックおよび理由を説明するセル間で切り替えを行うことができます。Webスクレイピングにおいて、Jupyter Notebookは特に便利なツールであるといえます。初級開発者向けのチュートリアルを作成し、プロセスの各ステップをガイドするために使用することもできます。

科学と研究(研究開発)

Jupyter Notebookでは、そのインタラクティブな性質により、共同作業のためのエクスポートが簡単に行えるため、研究や研究開発の目的にも最適です。これは、特にWebスクレイピングについていえます。例として、複数回の試行錯誤が必要となるウェブサイトのスクレイピング時には、すべてのテストを1つのNotebookにまとめ、Markdownを使って成功したテストを強調することができます。

データ探索

Jupyterライブラリは、データ探索および分析のために特別に設計されています。これは、 機械学習用のWebスクレイピングにも最適なツールであることを意味します。

このユースケースは、上記のコーディング例にも直接適用されるものです。当該例では、ウェブサイトからデータを取得し、すぐに分析しましたが、これはすべて同じコーディング環境内で行われました。

まとめ

今回の投稿では、Jupyter NotebookがいかにWebスクレイピングのための強力なツールとなり、インタラクティブかつ柔軟なデータ抽出および分析環境を提供するかを学びました。ただし、Webスクレイピング作業のスケーリングやタスクの自動化においては、Jupyter Notebookは必ずしも効率的なソリューションであるとはいえません。

ここで、当社のWeb Scrapersが役に立ちます。必要となるのがAPIベースのソリューションであるか、またはノーコードのオプションであるかに関わらず、当社のWeb Scrapersは、データ収集作業を簡素化および強化するように設計されています。100を超えるドメインの専用エンドポイントや、一括リクエスト処理、 自動IPローテーションCAPTCHA解決などの機能により、構造化データを簡単かつ広範に抽出することができます。今すぐ無料のBright Dataアカウントを作成して、当社のスクレイピングソリューションやプロキシをお試しください!

クレジットカードは必要ありません