読み込み中...

初心者でも安心!Pythonを使ったWebスクレイピング入門10選

Pythonで始めるWebスクレイピングガイド Python
この記事は約19分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

インターネット上には膨大な情報が存在します。

その情報を効率よく収集するための技術として、Webスクレイピングがあります。

この記事では、Webスクレイピングを初めて学ぶ方でも理解しやすいように、Pythonを使ったWebスクレイピングの基本から応用までを10の手順で詳しく解説します。

サンプルコードを通じて具体的な方法を学び、PythonでWebスクレイピングを活用する力を身につけましょう。

●Pythonとは

Pythonとは、親しみやすさと強力な機能性を兼ね備えたプログラミング言語です。

そのため、初心者でも扱いやすく、かつ、高度なデータ分析や機械学習にも使用されるという、幅広い用途に対応しています。

○Pythonの特徴

Pythonの最大の特徴はその読みやすさと書きやすさです。

Pythonは、明確な構文ルールと高い可読性が求められるため、他の人が書いたコードでも理解しやすいのが特徴です。

また、豊富なライブラリが提供されており、その多くが無料で利用できます。

これにより、開発者はより短いコードで複雑な機能を実現できます。

●Webスクレイピングとは

Webスクレイピングとは、ウェブページから必要なデータを抽出する技術のことを指します。

これにより、手動で情報を集めるのではなく、自動的に大量のデータを収集することが可能となります。

○Webスクレイピングの基本

Webスクレイピングを行うためには、まず対象となるWebページのHTMLを解析し、必要な情報がどこにあるのかを見つけ出すことが必要です。

HTMLはWebページの構造を表現する言語で、特定の情報は特定のHTMLタグの中に配置されています。

Webスクレイピングでは、これらのタグを見つけ出し、タグの中にある情報を取り出すことでデータを抽出します。

●PythonでWebスクレイピングを始める前に

PythonでWebスクレイピングを始めるためには、まずPythonの開発環境を整える必要があります。

○開発環境の準備

Pythonの開発環境としては、AnacondaやPyCharm、Jupyter Notebookなどが一般的です。

Pythonの公式ウェブサイトからダウンロードでき、インストールも容易です。

また、Pythonのバージョン管理を行うためにpyenvを使用することもおすすめします。

○必要なライブラリのインストール

PythonでWebスクレイピングを行うには、BeautifulSoupやrequestsなどのライブラリが必要です。

これらのライブラリは、Pythonのパッケージ管理システムであるpipを使用して簡単にインストールできます。

下記のコマンドを実行して、ライブラリをインストールしましょう。

pip install beautifulsoup4
pip install requests

ここではbeautifulsoup4とrequestsをインストールしています。

beautifulsoup4はHTMLの解析を、requestsはWebページへのアクセスを簡単に行うことができるライブラリです。

それぞれのインストールが成功すると、コマンドプロンプトにはインストールが完了した旨のメッセージが表示されます。

●PythonでのWebスクレイピングの基本的な方法

まず初めに、Pythonを使ってどのようにWebページから情報を取得するか、基本的な方法を解説します。

それでは早速、実際のサンプルコードを見てみましょう。

○サンプルコード1:単純なWebページのデータ取得

このサンプルコードでは、Pythonのライブラリであるrequestsを用いて特定のWebページにアクセスし、その全体のHTMLを取得します。

ここでは例として、Pythonの公式ウェブサイトを対象にしています。

import requests

# WebページのURL
url = 'https://www.python.org/'

# requestsを使ってWebページを取得
response = requests.get(url)

# ページの全体のHTMLを表示
print(response.text)

このコードを実行すると、Pythonの公式ウェブサイトのHTML全体がコンソールに表示されます。これにより、Webページの構造を理解し、必要な情報がどこにあるか探すことができます。

次に、取得したHTMLから特定の情報を抽出する方法について見ていきましょう。

○サンプルコード2:Webページから特定の要素を抽出

このサンプルコードでは、前述のサンプルコードで取得したHTMLから、BeautifulSoup4を使用して特定の要素を抽出します。

ここでは例として、Webページのタイトルを取得してみましょう。

from bs4 import BeautifulSoup
import requests

# WebページのURL
url = 'https://www.python.org/'

# requestsを使ってWebページを取得
response = requests.get(url)

# BeautifulSoupでHTMLを解析
soup = BeautifulSoup(response.text, 'html.parser')

# ページタイトルを抽出
title = soup.title.string

# タイトルを表示
print(title)

このコードではBeautifulSoupのオブジェクトを生成してHTMLを解析し、その後、soup.title.stringでWebページのタイトルを抽出しています。

コードを実行すると、Pythonの公式ウェブサイトのタイトルがコンソールに表示されます。

これらがPythonを用いたWebスクレイピングの基本的な手法です。

まずはこれらのコードを理解し、自分で実行してみることで、Pythonを使ったWebスクレイピングの基礎を身につけましょう。

●PythonでのWebスクレイピングの応用的な方法

基本的な手法を理解したところで、次にPythonでのWebスクレイピングの応用的な方法について解説します。

○サンプルコード3:ページ内のリンクを全て取得

このサンプルコードでは、BeautifulSoupを用いてWebページ内の全てのリンクを取得します。

リンクは通常、<a>タグのhref属性に格納されています。

そのため、<a>タグのhref属性を抽出することでリンクを取得できます。

from bs4 import BeautifulSoup
import requests

# WebページのURL
url = 'https://www.python.org/'

# requestsを使ってWebページを取得
response = requests.get(url)

# BeautifulSoupでHTMLを解析
soup = BeautifulSoup(response.text, 'html.parser')

# ページ内の全てのリンクを取得
links = [a.get('href') for a in soup.find_all('a') if a.get('href')]

# リンクを表示
for link in links:
    print(link)

このコードを実行すると、Python公式ウェブサイト内に存在する全てのリンクがコンソールに表示されます。

○サンプルコード4:複数ページに跨ってデータを取得

次に進める前に、Webスクレイピングの実用性を大いに高めるテクニック、それは複数ページに跨ってデータを取得する方法を解説します。

この例では、Python公式ウェブサイトのブログの各ページから全ての記事のタイトルを取得します。

from bs4 import BeautifulSoup
import requests

# スクレイピングするWebページのURL(Python公式ブログ)
base_url = 'https://www.python.org/blogs/'
page_url = 'https://www.python.org/blogs/'

# 全てのブログのタイトルを格納するリスト
all_titles = []

while True:
    # requestsを使ってWebページを取得
    response = requests.get(page_url)

    # BeautifulSoupでHTMLを解析
    soup = BeautifulSoup(response.text, 'html.parser')

    # ブログのタイトルを取得
    titles = [h3.text for h3 in soup.find_all('h3')]

    # 取得したタイトルを全体のリストに追加
    all_titles.extend(titles)

    # 次のページへのリンクを取得
    next_link = soup.find('a', {'class': 'next'})

    # 次のページが存在しなければ終了
    if next_link is None:
        break

    # 次のページのURLを取得
    page_url = base_url + next_link.get('href')

# 全てのブログのタイトルを表示
for title in all_titles:
    print(title)

このコードはPython公式ウェブサイトのブログから全ての記事のタイトルを抽出します。

ページに次のリンクが存在しなくなるまで、次のページに遷移し続けます。

そのため、複数のページに渡ってデータを取得できます。

実行すると、全てのブログのタイトルがコンソールに表示されます。

これで、あなたも複数ページに跨ってデータを取得する技術を身につけました。

このテクニックは、大量のデータを持つウェブサイトから情報を取得する際に非常に役立ちます。

●PythonでのWebスクレイピングの注意点と対処法

次に、PythonでWebスクレイピングを行う際の注意点とその対処法について解説します。

Webスクレイピングは強力なツールですが、正しく使わないとウェブサイトの管理者に迷惑をかける可能性があります。

そのため、Webスクレイピングの実行は、必ずサイトの利用規約を確認し、適切なマナーを守りながら行ってください。

●PythonでのWebスクレイピングのカスタマイズ方法

Pythonを使ったWebスクレイピングは高度にカスタマイズ可能です。

それでは、取得したデータの保存方法をカスタマイズする方法と、リクエストの間隔を調整する方法を解説していきます。

○サンプルコード5:取得データの保存方法のカスタマイズ

これまでに学んだスクレイピングの技術で得られたデータを、どのように保存すれば良いのでしょうか?

Pythonでは、その保存方法にも柔軟性があります。ここではCSV形式として保存する例を見てみましょう。

下記のサンプルコードでは、Python公式ウェブサイトのブログから取得した全ての記事タイトルをCSVファイルに保存します。

from bs4 import BeautifulSoup
import requests
import csv

base_url = 'https://www.python.org/blogs/'
page_url = 'https://www.python.org/blogs/'
all_titles = []

while True:
    response = requests.get(page_url)
    soup = BeautifulSoup(response.text, 'html.parser')
    titles = [h3.text for h3 in soup.find_all('h3')]
    all_titles.extend(titles)
    next_link = soup.find('a', {'class': 'next'})
    if next_link is None:
        break
    page_url = base_url + next_link.get('href')

# CSVファイルに書き出し
with open('blog_titles.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for title in all_titles:
        writer.writerow([title])

このコードでは、先程と同様に複数ページのブログ記事のタイトルを取得しますが、その後CSVファイルとして保存します。

保存する際にはPythonの組み込みモジュールであるcsvを利用します。

このコードを実行すると、同じディレクトリ内に’blog_titles.csv’という名前のCSVファイルが作成され、取得した全てのブログ記事のタイトルがその中に保存されます。

○サンプルコード6:リクエスト間隔の調整

次に紹介するのはリクエスト間隔の調整です。

これは非常に重要なテクニックで、これを用いることでウェブサイトに負荷をかけすぎず、かつ自身がウェブサイトからアクセス禁止となるリスクを避けることが可能です。

下記のサンプルコードでは、Python標準ライブラリのtimeを使用して、各リクエストの間に一定時間待機します。

from bs4 import BeautifulSoup
import requests
import time

base_url = 'https://www.python.org/blogs/'
page_url = 'https://www.python.org/blogs/'
all_titles = []

while True:
    response = requests.get(page_url)
    soup = BeautifulSoup(response.text, 'html.parser')
    titles = [h3.text for h3 in soup.find_all('h3')]
    all_titles.extend(titles)
    next_link = soup.find('a', {'class': 'next'})
    if next_link is None:
        break
    page_url = base_url + next_link.get('href')
    # リクエスト間に5秒の間隔を設ける
    time.sleep(5)

このコードでは、Pythonのtimeモジュールを使って、リクエストの間に5秒の待機時間を設けています。

これにより、Python.orgのサーバーに対する負荷を軽減し、自分のIPアドレスがアクセス禁止になるリスクを減らすことができます。

●PythonでのWebスクレイピングの更なる応用例

PythonでのWebスクレイピングの可能性は、単純なデータ取得から遠く離れています。

ログインが必要なウェブサイトからのデータ取得、APIを使用したデータ取得、JavaScriptを使用したウェブサイトからのデータ取得、取得したスクレイピング結果をデータベースに保存するなど、さまざまな応用例があります。

○サンプルコード7:ログインが必要なサイトからのデータ取得

通常、ログインが必要なウェブサイトでは、特定のユーザー情報に基づいてページ内容がカスタマイズされます。

このようなサイトからデータを取得するには、Pythonのrequestsライブラリを使ってログイン処理を模倣することができます。

下記のコードは、ログインが必要なウェブサイトからデータを取得する一例です。

試す前に、自分のユーザー名とパスワードを用意してください。

import requests
from bs4 import BeautifulSoup

login_url = 'https://www.example.com/login'
data_url = 'https://www.example.com/data'
payload = {
    'username': 'your_username',
    'password': 'your_password'
}

with requests.Session() as s:
    p = s.post(login_url, data=payload)
    r = s.get(data_url)
    soup = BeautifulSoup(r.text, 'html.parser')
    # ここでスクレイピング処理を行う

このコードでは、requests.Session()を使用して、サイトのログイン状態を保持します。

s.postを使用してログイン情報を送信し、その後のs.getでログイン状態を維持したまま特定のページからデータを取得します。

このテクニックを使用すると、ログインが必要なサイトからのデータ取得も可能になります。

○サンプルコード8:APIを使ったデータ取得

API(Application Programming Interface)は、ソフトウェアの機能を外部から利用するためのインターフェースのことで、ウェブサイトでは一般的にデータを取得したり操作したりするためのAPIが提供されています。

APIを使うことで、ウェブページから直接スクレイピングすることなく、より構造化された形でデータを取得することが可能となります。

下記のコードは、公開APIからデータを取得する例です。

import requests

api_url = 'https://api.example.com/data'
params = {'key1': 'value1', 'key2': 'value2'}

response = requests.get(api_url, params=params)
data = response.json()

# dataにはAPIから取得したJSONデータが格納されます

このコードでは、requests.getメソッドを使ってAPIからデータを取得します。

APIのURLとパラメータを指定することで、特定のデータを取得することが可能です。

取得したデータはJSON形式となっており、Pythonの辞書型のように扱うことができます。

○サンプルコード9:JavaScriptを用いたサイトからのデータ取得

Pythonでウェブスクレイピングを行うとき、JavaScriptを使用して動的にコンテンツが生成されるウェブサイトは少し手間がかかります。

これは、通常のrequestsやBeautifulSoupではJavaScriptを実行できないためです。

しかし、Seleniumなどのブラウザ自動化ツールを使用すれば、JavaScriptを実行しながらウェブスクレイピングが可能になります。

下記のコードは、Seleniumを使用してJavaScriptの実行結果を取得する一例です。

動作確認するためには、予めSelenium WebDriverがインストールされていることが必要です。

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Firefox()  # または webdriver.Chrome(), webdriver.Edge() 等
url = 'https://www.example.com'
driver.get(url)

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# ここでスクレイピング処理を行う

driver.quit()

このコードでは、SeleniumのWebDriverを使って、通常のウェブブラウザと同様にページを開いています。

WebDriver.getメソッドを使って指定したURLのページを開き、WebDriver.page_source属性を用いて現在のページのHTMLを取得しています。

このHTMLはJavaScriptによって動的に生成されたものも含まれていますので、通常のスクレイピングでは取得できない情報も取得できます。

ただし、Seleniumを使用すると処理速度が遅くなる点と、WebDriverが必要な点には注意が必要です。

○サンプルコード10:スクレイピング結果をデータベースに保存

スクレイピングした結果を効率的に管理するためには、データベースに保存することが一般的です。

PythonにはSQLiteなどの軽量なデータベースライブラリがあり、これを使用すると簡単にデータベースにデータを保存することができます。

下記のコードは、スクレイピングした結果をSQLiteのデータベースに保存する一例です。

import sqlite3
from bs4 import BeautifulSoup
import requests

url = 'https://www.example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# データベースに接続(なければ新規作成)
conn = sqlite3.connect('scraping_results.db')
c = conn.cursor()

# テーブルの作成(すでに存在する場合は作成しない)
c.execute('CREATE TABLE IF NOT EXISTS results (title text, link text)')

# データの取得と保存
for link in soup.find_all('a'):
    title = link.text
    url = link.get('href')
    c.execute('INSERT INTO results VALUES (?, ?)', (title, url))

# 変更をコミット(保存)
conn.commit()

# データベース接続を閉じる
conn.close()

このコードでは、まずBeautifulSoupとrequestsを用いてウェブスクレイピングを行います。

その後、sqlite3を使用してデータベースに接続し、スクレイピングした結果を保存します。

sqlite3.connectメソッドでデータベースに接続し、カーソルオブジェクトを作成します。

カーソルのexecuteメソッドを使ってSQL文を実行し、データベースにテーブルを作成したり、データを挿入したりします。

最後に、commitメソッドで変更を保存し、closeメソッドでデータベース接続を閉じます。

これにより、スクレイピングした結果を永続的に保存し、後で分析するなどの作業が可能になります。

ただし、大量のデータを扱う場合や複数のテーブルを使用する場合は、より高機能なデータベースシステム(MySQLやPostgreSQLなど)の使用を検討すると良いでしょう。

まとめ

今回は、Pythonを使用したWebスクレイピングの基本から応用まで、10のサンプルコードを通して紹介してきました。

Webスクレイピングは、ウェブ上の情報を効率的に取得する強力なツールですが、使用する際は各ウェブサイトの利用規約や法律を遵守することが大切です。

また、PythonにはrequestsやBeautifulSoup、Seleniumなどの便利なライブラリがあり、これらを組み合わせることで様々なスクレイピングを実現できます。

ただし、それぞれのライブラリは特性や使い方が異なるため、目的に応じて適切なライブラリを選ぶことが重要です。

スクレイピングの結果を効率的に保存するためには、データベースの利用が一般的です。

PythonはSQLiteなどの軽量なデータベースライブラリを持っており、これらを使用すると容易にデータベースにデータを保存することができます。

これからもPythonのWebスクレイピング技術を学んでいき、ウェブ上の情報を自在に取り扱えるようになりましょう。

この記事が皆さんの学習の一助になれば幸いです。