[Python] Webページをスクレイピングした結果をスプレッドシートに出力する方法

PythonでWebページをスクレイピングし、その結果をGoogleスプレッドシートに出力するには、まずrequestsBeautifulSoupを使ってWebページのデータを取得・解析します。

次に、Google Sheets APIを利用してスプレッドシートにデータを出力します。

Google Sheets APIを使用するには、Google CloudでAPIを有効化し、OAuth 2.0認証を行う必要があります。

gspreadライブラリを使うと、スプレッドシートへの書き込みが簡単に行えます。

この記事でわかること
  • Pythonでのスクレイピング環境の構築方法
  • Webページからデータを取得する手法
  • Googleスプレッドシートへのデータ出力方法
  • スクレイピング結果の自動化手法
  • データの可視化とグラフ化の方法

新たなプロジェクトに取り組む際に、これらの知識を活用してみることをお勧めします

目次から探す

Pythonでのスクレイピング環境の準備

Webページをスクレイピングし、その結果をスプレッドシートに出力するためには、まず必要な環境を整える必要があります。

以下に、必要なライブラリのインストール方法とGoogle Sheets APIの準備手順を説明します。

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

Pythonでスクレイピングを行うためには、主に以下の2つのライブラリが必要です。

スクロールできます
ライブラリ名用途
requestsWebページの取得
BeautifulSoupHTMLの解析

requestsのインストール

requestsライブラリは、HTTPリクエストを簡単に行うためのライブラリです。

以下のコマンドを実行してインストールします。

pip install requests

BeautifulSoupのインストール

BeautifulSoupは、HTMLやXMLの解析を行うためのライブラリです。

beautifulsoup4パッケージをインストールするには、以下のコマンドを実行します。

pip install beautifulsoup4

Google Sheets APIの準備

次に、Google Sheetsにデータを出力するために、Google Sheets APIを準備します。

Google Cloudでのプロジェクト作成

  1. Google Cloud Consoleにアクセスします。
  2. 新しいプロジェクトを作成します。
  3. プロジェクト名を入力し、「作成」をクリックします。

APIの有効化と認証情報の取得

  1. 作成したプロジェクトのダッシュボードに移動します。
  2. 「APIとサービス」 > 「ライブラリ」を選択します。
  3. Google Sheets API を検索し、有効化します。
  4. 「APIとサービス」 > 「認証情報」を選択し、「認証情報を作成」をクリックします。
  5. 「サービスアカウント」を選択し、必要な情報を入力して作成します。
  6. 作成したサービスアカウントのメールアドレスをコピーし、Google Sheetsの共有設定でこのメールアドレスを追加します。

gspreadライブラリのインストール

gspreadは、Google Sheets APIを簡単に操作するためのライブラリです。

以下のコマンドを実行してインストールします。

pip install gspread

これで、Pythonでのスクレイピング環境が整いました。

次のステップでは、実際にWebページからデータを取得する方法について説明します。

Webページのデータを取得する

Webページからデータを取得するためには、まずrequestsライブラリを使ってWebページを取得し、その後BeautifulSoupを使ってHTMLを解析します。

以下にその手順を詳しく説明します。

requestsを使ったWebページの取得

requestsライブラリを使用して、指定したURLからWebページの内容を取得します。

以下は、基本的な使用例です。

import requests
# 取得したいWebページのURL
url = 'https://example.com'
# Webページを取得
response = requests.get(url)
# ステータスコードを確認
if response.status_code == 200:
    print("ページの取得に成功しました。")
else:
    print("ページの取得に失敗しました。")
ページの取得に成功しました。

BeautifulSoupを使ったHTMLの解析

取得したHTMLを解析するために、BeautifulSoupを使用します。

以下のコードでは、取得したHTMLを解析し、特定のデータを抽出します。

from bs4 import BeautifulSoup
# 取得したHTMLを解析
soup = BeautifulSoup(response.text, 'html.parser')
# ページタイトルを取得
title = soup.title.string
print("ページタイトル:", title)
ページタイトル: Example Domain

タグやクラスを指定してデータを抽出する方法

特定のタグやクラスを指定してデータを抽出することができます。

以下の例では、<h1>タグの内容を取得します。

# <h1>タグの内容を取得
h1_text = soup.find('h1').text
print("H1タグの内容:", h1_text)
H1タグの内容: Example Domain

複数の要素を一度に取得する方法

複数の要素を一度に取得するには、find_allメソッドを使用します。

以下の例では、すべての<p>タグの内容を取得します。

# すべての<p>タグを取得
p_tags = soup.find_all('p')
for p in p_tags:
    print("Pタグの内容:", p.text)
Pタグの内容: This domain is for use in illustrative examples in documents.
Pタグの内容: You may use this domain in literature without prior coordination or asking for permission.

取得したデータの整形

取得したデータは、そのままでは使いにくい場合があります。

データを整形して、リストや辞書形式で整理します。

リストや辞書形式でデータを整理する

例えば、複数の<p>タグの内容をリストに格納することができます。

# <p>タグの内容をリストに格納
p_texts = [p.text for p in p_tags]
print("Pタグの内容リスト:", p_texts)
Pタグの内容リスト: ['This domain is for use in illustrative examples in documents.', 'You may use this domain in literature without prior coordination or asking for permission.']

不要なデータのフィルタリング

取得したデータの中には、不要な情報が含まれていることがあります。

これをフィルタリングすることで、必要なデータだけを残すことができます。

# 特定のキーワードを含む<p>タグのみを取得
filtered_p_texts = [p.text for p in p_tags if 'domain' in p.text]
print("フィルタリングされたPタグの内容:", filtered_p_texts)
フィルタリングされたPタグの内容: ['This domain is for use in illustrative examples in documents.', 'You may use this domain in literature without prior coordination or asking for permission.']

これで、Webページからデータを取得し、整形する方法が理解できました。

次のステップでは、取得したデータをGoogleスプレッドシートに出力する方法について説明します。

Googleスプレッドシートにデータを出力する

Webページから取得したデータをGoogleスプレッドシートに出力するためには、Google Sheets APIを使用します。

以下に、APIの認証方法やgspreadライブラリを使ったスプレッドシート操作について説明します。

Google Sheets APIの認証

Google Sheets APIを使用するためには、OAuth 2.0認証を設定し、認証トークンを取得する必要があります。

OAuth 2.0認証の設定

  1. Google Cloud Consoleで作成したプロジェクトに移動します。
  2. 「APIとサービス」 > 「認証情報」を選択します。
  3. 「認証情報を作成」から「OAuthクライアントID」を選択します。
  4. アプリケーションの種類を「デスクトップアプリ」に設定し、必要な情報を入力して作成します。
  5. 作成したクライアントIDとクライアントシークレットをメモしておきます。

認証トークンの取得と使用

次に、OAuth 2.0を使用して認証トークンを取得します。

以下のコードを実行して、認証を行います。

import gspread
from oauth2client.service_account import ServiceAccountCredentials
# スコープの設定
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
# 認証情報の設定
creds = ServiceAccountCredentials.from_json_keyfile_name('path/to/credentials.json', scope)
# 認証トークンの取得
client = gspread.authorize(creds)

ここで、path/to/credentials.jsonは、Google Cloud Consoleからダウンロードした認証情報ファイルのパスです。

gspreadを使ったスプレッドシート操作

gspreadライブラリを使用して、スプレッドシートの作成やデータの書き込みを行います。

スプレッドシートの作成・選択

新しいスプレッドシートを作成するには、以下のコードを使用します。

# 新しいスプレッドシートを作成
spreadsheet = client.create('新しいスプレッドシート名')
# 作成したスプレッドシートを選択
worksheet = spreadsheet.get_worksheet(0)  # 最初のシートを選択

シートへのデータ書き込み

取得したデータをスプレッドシートに書き込むには、以下のようにします。

# データの書き込み
data = [['タイトル', '内容'], ['Example Domain', 'This domain is for use in illustrative examples in documents.']]
worksheet.insert_rows(data, 1)  # 1行目からデータを挿入

既存のシートにデータを追記する方法

既存のスプレッドシートにデータを追記する場合は、以下のようにします。

# 既存のスプレッドシートを開く
spreadsheet = client.open('既存のスプレッドシート名')
worksheet = spreadsheet.get_worksheet(0)  # 最初のシートを選択
# データの追記
new_data = ['新しいデータ1', '新しいデータ2']
worksheet.append_row(new_data)  # 最後の行にデータを追加

データのフォーマットと整形

スプレッドシートに書き込んだデータを見やすくするために、フォーマットや整形を行います。

セルの書式設定

特定のセルの書式を設定するには、以下のようにします。

# セルの書式設定
worksheet.format('A1:B1', {'textFormat': {'bold': True}})  # 1行目を太字にする

データの自動更新

データを自動的に更新するためには、定期的にスクリプトを実行する必要があります。

これには、cronジョブやPythonのスケジューリングライブラリを使用します。

以下は、scheduleライブラリを使った例です。

import schedule
import time
def job():
    # スクレイピングとデータの更新処理をここに記述
    print("データを更新しました。")
# 1時間ごとに実行
schedule.every(1).hours.do(job)
while True:
    schedule.run_pending()
    time.sleep(1)

これで、Googleスプレッドシートにデータを出力する方法が理解できました。

次のステップでは、応用例やよくある質問について説明します。

応用例:スクレイピング結果の自動化

スクレイピングの結果を自動化することで、定期的にデータを取得し、必要な情報を迅速に得ることができます。

以下に、スクレイピング結果の自動化に関する応用例を紹介します。

定期的にスクレイピングを実行する方法

定期的にスクレイピングを実行するための方法はいくつかあります。

cronを使った定期実行

LinuxやmacOS環境では、cronを使用して定期的にスクリプトを実行できます。

以下は、毎日午前9時にスクリプトを実行するためのcron設定の例です。

  1. ターミナルでcrontab -eを実行して、cronの設定ファイルを開きます。
  2. 以下の行を追加します。
0 9 * * * /usr/bin/python3 /path/to/your_script.py

ここで、/path/to/your_script.pyは実行したいPythonスクリプトのパスです。

Pythonのスケジューリングライブラリを使う

Python内でスケジューリングを行うには、scheduleライブラリを使用します。

以下は、毎日午前9時にスクレイピングを実行する例です。

import schedule
import time
def scrape_data():
    # スクレイピング処理をここに記述
    print("データをスクレイピングしました。")
# 毎日午前9時に実行
schedule.every().day.at("09:00").do(scrape_data)
while True:
    schedule.run_pending()
    time.sleep(1)

スクレイピング結果をメールで通知する

スクレイピングの結果をメールで通知することで、リアルタイムで情報を受け取ることができます。

smtplibを使ったメール送信

Pythonのsmtplibを使用して、メールを送信することができます。

以下は、Gmailを使用してメールを送信する例です。

import smtplib
from email.mime.text import MIMEText
def send_email(subject, body):
    sender = 'your_email@gmail.com'
    receiver = 'recipient_email@example.com'
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = receiver
    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
        server.login(sender, 'your_password')
        server.sendmail(sender, receiver, msg.as_string())
# メール送信の例
send_email('スクレイピング結果', 'データをスクレイピングしました。')

Gmail APIを使ったメール送信

Gmail APIを使用すると、より安全にメールを送信できます。

以下は、Gmail APIを使用してメールを送信する基本的な手順です。

  1. Google Cloud ConsoleでGmail APIを有効化し、OAuth 2.0の認証情報を取得します。
  2. google-authgoogle-api-python-clientライブラリをインストールします。
pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
  1. 以下のコードを使用してメールを送信します。
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
def send_email_via_gmail(subject, body):
    creds = Credentials.from_authorized_user_file('path/to/credentials.json')
    service = build('gmail', 'v1', credentials=creds)
    message = {
        'raw': base64.urlsafe_b64encode(f'To: recipient_email@example.com\nSubject: {subject}\n\n{body}'.encode()).decode()
    }
    service.users().messages().send(userId='me', body=message).execute()
# メール送信の例
send_email_via_gmail('スクレイピング結果', 'データをスクレイピングしました。')

スプレッドシートのデータをグラフ化する

取得したデータを視覚的に表示するために、スプレッドシートのデータをグラフ化することができます。

Google Sheetsのグラフ機能を活用する

Google Sheetsには、データをグラフ化するための機能が組み込まれています。

スプレッドシートにデータを入力した後、以下の手順でグラフを作成できます。

  1. データ範囲を選択します。
  2. メニューから「挿入」 > 「グラフ」を選択します。
  3. グラフの種類を選択し、必要に応じてカスタマイズします。

Pythonでデータを可視化する方法

Pythonのmatplotlibseabornライブラリを使用して、データを可視化することもできます。

以下は、matplotlibを使用した基本的なグラフの作成例です。

import matplotlib.pyplot as plt
# データの例
labels = ['データ1', 'データ2', 'データ3']
values = [10, 20, 15]
# グラフの作成
plt.bar(labels, values)
plt.title('スクレイピング結果のグラフ')
plt.xlabel('項目')
plt.ylabel('値')
plt.show()

これで、スクレイピング結果の自動化に関する応用例が理解できました。

次のステップでは、よくある質問について説明します。

よくある質問

スクレイピングがブロックされる場合はどうすればいい?

スクレイピングがブロックされる原因はいくつかありますが、以下の対策を試みることで回避できる場合があります。

  • User-Agentの変更: デフォルトのUser-Agentを変更して、ブラウザからのアクセスに見せかけることができます。

例えば、requestsライブラリを使用する際に、以下のように設定します。

  headers = {'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'}
  response = requests.get(url, headers=headers)
  • リクエストの間隔を空ける: 短時間に大量のリクエストを送信すると、サーバーに負荷をかけてブロックされることがあります。

time.sleep()を使ってリクエストの間隔を調整しましょう。

  • プロキシの使用: IPアドレスがブロックされるのを防ぐために、プロキシサーバーを使用することも有効です。

スプレッドシートのAPI制限に引っかかる場合の対処法は?

Google Sheets APIには、リクエスト数やデータの書き込み回数に制限があります。

以下の対策を考慮してください。

  • リクエストの最適化: 不要なリクエストを減らし、必要なデータのみを取得するようにします。

例えば、データを一度にまとめて書き込むことで、APIの呼び出し回数を減らすことができます。

  • エラーハンドリング: API制限に引っかかった場合、エラーメッセージを確認し、適切にリトライするロジックを実装します。

例えば、429エラー(Too Many Requests)が返された場合は、一定時間待ってから再試行します。

  • APIの使用状況を確認: Google Cloud ConsoleでAPIの使用状況を確認し、制限に達している場合は、必要に応じて制限を引き上げるリクエストを行います。

スクレイピングしたデータが正しく取得できない場合の原因は?

スクレイピングしたデータが正しく取得できない場合、以下のような原因が考えられます。

  • HTML構造の変更: スクレイピング対象のWebページのHTML構造が変更されると、以前のコードが機能しなくなることがあります。

定期的にHTML構造を確認し、必要に応じてコードを修正します。

  • JavaScriptによる動的コンテンツ: 一部のWebページはJavaScriptを使用して動的にコンテンツを生成します。

この場合、requestsBeautifulSoupだけではデータを取得できません。

Seleniumなどのブラウザ自動化ツールを使用して、JavaScriptが実行された後のHTMLを取得する必要があります。

  • セレクタの誤り: データを抽出するためのセレクタ(タグ名、クラス名など)が間違っている場合、正しいデータが取得できません。

セレクタを再確認し、正しいものに修正します。

これらの対策を講じることで、スクレイピングの精度を向上させることができます。

まとめ

この記事では、Pythonを使用してWebページをスクレイピングし、その結果をGoogleスプレッドシートに出力する方法について詳しく解説しました。

具体的には、必要なライブラリのインストールから始まり、データの取得、整形、スプレッドシートへの書き込み、さらには自動化の手法まで幅広く取り上げました。

これらの知識を活用することで、効率的にデータを収集し、管理することが可能になります。

ぜひ、実際に手を動かして、スクレイピングやデータ管理のスキルを向上させてみてください。

  • URLをコピーしました!
目次から探す