無料プログラミング教室 Pスクール Python Webスクレイピング入門 第10章: Pythonでスクレイピングの自動化

第10章: Pythonでスクレイピングの自動化

データ収集を効率化し、特定の時間や間隔で定期的にWebページをスクレイピングするための技術を身につけることで、手動で実行する必要がなくなり、より高度なデータ分析やビジネスプロセスの自動化に役立てることができます。

本章では、以下のトピックを中心に解説します。

  1. 自動化の概要とメリット
  2. Pythonのスクリプトの自動実行
  3. Linux環境でのCronジョブの設定
  4. Windows環境でのタスクスケジューラの利用
  5. Python内でスケジューリングを実装する方法
  6. 自動化のためのエラー処理と通知システム
  7. 実際のプロジェクトにおける自動化の応用例

1. 自動化の概要とメリット

Webスクレイピングを行う上で、同じ作業を何度も手動で実行するのは非効率です。特に、定期的にデータを収集したり、継続的にモニタリングしたいサイトがある場合、スクレイピングの自動化は非常に便利です。

自動化には以下のようなメリットがあります。

  • 時間の節約: 手動操作を削減し、定期的なデータ収集を自動化できます。
  • 正確性の向上: 手動操作に比べて、ヒューマンエラーが減り、正確なデータ取得が可能です。
  • リアルタイム性の確保: 定期的に最新のデータを取得することで、リアルタイムのデータモニタリングが可能になります。

2. Pythonのスクリプトの自動実行

まず、Pythonで作成したWebスクレイピングスクリプトを、どのようにして自動的に実行するかを考えます。一般的には、以下の手順でスクリプトの自動実行を実現します。

  1. スクリプトを作成する。
  2. 定期的に実行する仕組み(CronジョブやWindowsのタスクスケジューラ)を設定する。

例えば、以下のようなシンプルなスクレイピングスクリプトがあるとしましょう。

import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

# ターゲットのURL
url = 'https://example.com/data-page'

# スクレイピング関数
def scrape_data():
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# データの抽出(仮の例)
data = soup.find_all('div', class_='data-class')

# データの整理
extracted_data = []
for item in data:
extracted_data.append({
'timestamp': datetime.now(),
'data_value': item.text
})

# DataFrameに変換して保存
df = pd.DataFrame(extracted_data)
df.to_csv('scraped_data.csv', mode='a', header=False)

# 実行
scrape_data()

上記のスクリプトは、指定したURLからデータを定期的にスクレイピングし、結果をCSVファイルに追加保存します。これを定期的に実行できるようにするために、次にCronジョブやタスクスケジューラを設定します。

3. Linux環境でのCronジョブの設定

Linux環境では、Cronジョブを使ってスクリプトの定期実行を設定できます。CronはUnix系OSでスケジュールされたタスクを実行するためのデーモンで、指定した日時にコマンドやスクリプトを自動的に実行することができます。

Cronジョブの基本的な書式

Cronジョブは、以下の形式で書かれます。

* * * * * command

各アスタリスクは次の要素を表しています。

  1. 分(0〜59)
  2. 時(0〜23)
  3. 日(1〜31)
  4. 月(1〜12)
  5. 曜日(0〜6、日曜日が0)

例えば、毎日午前3時にスクリプトを実行するには、次のように記述します。

0 3 * * * /usr/bin/python3 /path/to/your_script.py

Cronジョブの設定手順

  1. Cronタブを開く
    ターミナルで以下のコマンドを実行して、Cronタブ(Cronジョブの設定ファイル)を編集します。
    crontab -e
  2. スクリプトのスケジュールを追加する
    開いたエディタで、以下のようにジョブを追加します。
    0 3 * * * /usr/bin/python3 /home/user/scrape_script.py
    これで、毎日午前3時にPythonスクリプトが実行されるようになります。

Cronジョブの確認

追加したCronジョブを確認するには、以下のコマンドを実行します。

crontab -l

Cronジョブが正しく設定されている場合、一覧が表示されます。

Cronジョブのログ確認

タスクの実行結果を確認するためには、ログファイルをチェックします。通常、ログは /var/log/cron または /var/log/syslog に出力されます。問題が発生した場合は、これらのログを確認することでトラブルシューティングが可能です。

4. Windows環境でのタスクスケジューラの利用

Windowsでは、タスクスケジューラを使用してPythonスクリプトを定期的に実行できます。タスクスケジューラは、Windowsに標準搭載されているタスク自動化ツールで、特定の時間や条件でタスクを実行することができます。

タスクスケジューラの設定手順

  1. タスクスケジューラを開く
    Windowsの検索バーで「タスクスケジューラ」と入力し、アプリケーションを開きます。
  2. 新しいタスクを作成する
    「タスクの作成」を選択し、以下の設定を行います。
    • 一般タブ: タスク名を入力します(例:「Pythonスクレイピング」)。
    • トリガータブ: 「新規」をクリックし、タスクの実行タイミングを設定します(例:毎日午前3時に実行)。
    • 操作タブ: 「新規」をクリックし、操作として「プログラムの開始」を選択します。プログラムにはPythonの実行ファイルパスを、引数にはスクリプトのパスを入力します(例:C:\Python39\python.exe C:\path\to\your_script.py)。
  3. タスクの保存と実行
    設定が完了したら「OK」をクリックしてタスクを保存します。タスクが正しく動作するかを確認するために、手動で一度実行してみることをお勧めします。

5. Python内でスケジューリングを実装する方法

外部のツールに頼らずに、Pythonスクリプト内でスケジューリングを行うことも可能です。この場合、scheduleというPythonライブラリを使用するのが便利です。

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

まず、schedule ライブラリをインストールします。

pip install schedule

scheduleを使ったスケジューリングの実装例

次に、以下のようにPythonスクリプトにスケジュール機能を組み込みます。

import schedule
import time

# スクレイピング関数
def scrape_data():
print("スクレイピング開始")
# スクレイピング処理
print("スクレイピング完了")

# 毎日午前3時にスクレイピングを実行するスケジュールを設定
schedule.every().day.at("03:00").do(scrape_data)

# 無限ループでスケジュールを実行し続ける
while True:
schedule.run_pending()
time.sleep(1)

このスクリプトは、毎日午前3時にscrape_data関数を実行します。schedule.run_pending()で登録されたタスクが実行され、time.sleep(1)で1秒ごとに実行待ちタスクがないかをチェックします。

6. 自動化のためのエラー処理と通知システム

自動化されたスクリプトが常に正常に動作するとは限りません。Webページのレイアウトが変わったり、ネットワーク接続が失敗することもあります。そのため、エラー処理をしっかりと行い、問題が発生した際に通知を受け取る仕組みを導入することが重要です。

エラー処理

エラーを適切に処理するためには、例外処理(try-except構文)を使います。例えば、ネットワークエラーが発生した場合、再試行するか、エラーメッセージを記録するコードを追加します。

import requests
from bs4 import BeautifulSoup
import time

url = 'https://example.com'

def scrape_data():
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# データ処理
except requests.exceptions.RequestException as e:
print(f"エラーが発生しました: {e}")
# エラーログをファイルに保存
with open('error_log.txt', 'a') as f:
f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - {e}\n")

scrape_data()

通知システム

エラーが発生した際に、通知を受け取るための仕組みを導入すると便利です。例えば、エラー時にメール通知を送信することができます。

以下は、smtplibを使ってエラーメッセージをメールで送信する例です。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_error_email(error_message):
sender = 'your_email@example.com'
recipient = 'recipient@example.com'
subject = 'スクレイピングエラー通知'
body = f"スクレイピング中にエラーが発生しました: {error_message}"

msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = recipient
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))

# メール送信
try:
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()
server.login(sender, 'your_password')
server.sendmail(sender, recipient, msg.as_string())
server.quit()
print("エラーメールが送信されました")
except Exception as e:
print(f"メール送信中にエラーが発生しました: {e}")

# エラー発生時にメール通知を送る
try:
# スクレイピング処理
pass
except Exception as e:
send_error_email(str(e))

7. 実際のプロジェクトにおける自動化の応用例

自動化されたスクレイピングは、様々な分野や業務で活用できます。特に、以下のような場面でその効力を発揮します。

1. 価格追跡システムの構築

Eコマースサイトやオンラインマーケットプレイスでの価格の変動を監視し、自動的に価格の履歴を記録するシステムは、消費者やビジネスにとって非常に有用です。自動化されたスクレイピングを使えば、毎日や毎時特定の商品ページを訪問し、価格情報を取得してデータベースに保存することができます。このようなシステムを活用することで、価格が目標値に達した場合に通知を送る、あるいは価格の推移を分析することで市場動向を把握することが可能です。

以下は、価格追跡システムの簡単な例です。

import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
import schedule
import time

# 監視する商品のURL
url = 'https://example.com/product-page'

# 価格をスクレイピングする関数
def scrape_price():
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 仮の価格抽出処理
price = soup.find('span', class_='price-tag').text.strip()

# データを記録する
timestamp = datetime.now()
df = pd.DataFrame({'timestamp': [timestamp], 'price': [price]})

# CSVに保存(既存ファイルに追記)
df.to_csv('price_data.csv', mode='a', header=False)
print(f"{timestamp}: 価格が取得されました - {price}")

# 毎日9時に価格を取得するスケジュール
schedule.every().day.at("09:00").do(scrape_price)

# スケジュールを実行する無限ループ
while True:
schedule.run_pending()
time.sleep(1)

このスクリプトは、特定の商品の価格を毎日午前9時に自動で取得し、CSVファイルに記録します。このデータを元に、グラフを作成して価格の推移を視覚化したり、一定の条件でアラートを送信する機能を追加することもできます。

2. ニュースの自動収集とフィルタリング

最新のニュースやブログ記事を定期的に収集し、特定のキーワードやテーマに基づいてフィルタリングするシステムは、トレンドの把握や競合調査、マーケティングのための情報収集に役立ちます。ニュースサイトやRSSフィードをスクレイピングして、必要な情報を抽出し、自動的に保存・フィルタリングするプロジェクトが可能です。

例えば、特定の技術に関連するニュースを自動で収集し、重要な記事だけを分析するシステムを構築することができます。

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import schedule
import time

# ニュースサイトのURL
url = 'https://example.com/tech-news'

# ニュース記事をスクレイピングする関数
def scrape_news():
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 仮のニュース抽出処理
articles = soup.find_all('div', class_='article')

for article in articles:
title = article.find('h2').text
summary = article.find('p').text
print(f"記事タイトル: {title}")
print(f"概要: {summary}\n")

# フィルタリング:特定のキーワードが含まれているかチェック
if 'Python' in title or 'Machine Learning' in summary:
print("関連するニュースが見つかりました!")

# 毎日午後1時にニュースを取得するスケジュール
schedule.every().day.at("13:00").do(scrape_news)

# スケジュールを実行する無限ループ
while True:
schedule.run_pending()
time.sleep(1)

このスクリプトは、毎日午後1時にニュースサイトをスクレイピングし、Pythonや機械学習に関連する記事をフィルタリングして表示します。さらに、結果をデータベースに保存したり、重要なニュースにメール通知を送るなどの追加機能を簡単に組み込むことができます。

3. ソーシャルメディアのトレンド分析

TwitterやInstagramなどのソーシャルメディアから定期的にデータを収集し、トレンドを分析することもスクレイピングの応用例です。APIを利用できる場合もありますが、APIの利用制限や必要なデータが取得できない場合には、スクレイピングによって補完することができます。

例えば、特定のハッシュタグやキーワードに基づいてツイートを収集し、ユーザーの感情分析を行うシステムを作成することができます。スクレイピングを使ってデータを定期的に取得し、自然言語処理技術と組み合わせることで、ソーシャルメディア上のトレンドやユーザーの反応を自動的に分析できるシステムが構築可能です。

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import pandas as pd
import schedule
import time

# ソーシャルメディアのターゲットURL
url = 'https://example.com/hashtag/python'

# ソーシャルメディアデータをスクレイピングする関数
def scrape_social_media():
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 仮のツイートデータ抽出処理
posts = soup.find_all('div', class_='post')

extracted_data = []
for post in posts:
username = post.find('span', class_='username').text
content = post.find('p', class_='content').text
timestamp = datetime.now()

# データをリストに格納
extracted_data.append({
'timestamp': timestamp,
'username': username,
'content': content
})

# DataFrameに変換してCSVに保存
df = pd.DataFrame(extracted_data)
df.to_csv('social_media_data.csv', mode='a', header=False)

print(f"{len(extracted_data)} 件の投稿が取得されました")

# 毎日2時間ごとにソーシャルメディアデータを取得
schedule.every(2).hours.do(scrape_social_media)

# スケジュールを実行する無限ループ
while True:
schedule.run_pending()
time.sleep(1)

このスクリプトは、ソーシャルメディアから投稿を2時間ごとに取得し、その内容をCSVファイルに保存します。さらに、感情分析ライブラリ(例えばTextBlobVADER)を使用して、各投稿の感情を分析する機能を追加することも可能です。

4. 競合他社のモニタリング

競合他社のウェブサイトを定期的に監視し、新しい製品やサービスの発表、価格の変更、キャンペーン情報などを自動で取得するシステムもビジネスにおいて非常に有用です。競合調査の一環として、特定のページを監視し、変化があった場合に通知を受け取ることができる仕組みを構築することが可能です。

例えば、以下のように競合他社の新しいブログ記事やニュースを監視するスクリプトを作成できます。

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import time

# 監視対象の競合他社のサイト
url = 'https://competitor.com/news'

# 最新のニュースをスクレイピングする関数
def scrape_competitor_news():
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 仮のニュース抽出処理
articles = soup.find_all('div', class_='news-article')

latest_articles = []
for article in articles:
title = article.find('h3').text
link = article.find('a')['href']
timestamp = datetime.now()

# データをリストに格納
latest_articles.append({
'timestamp': timestamp,
'title': title,
'link': link
})

# 最新ニュースをコンソールに表示
for article in latest_articles:
print(f"{article['timestamp']} - {article['title']} - {article['link']}")

# 毎日4時間ごとにニュースを監視
while True:
scrape_competitor_news()
time.sleep(4 * 3600)

このスクリプトは競合他社のニュースページを4時間ごとにスクレイピングし、新しい記事を取得します。これにより、競合他社の動向を素早く把握し、ビジネス戦略に役立てることができます。

まとめ

Pythonを使用したスクレイピングの自動化は、非常に多くの分野で有効に活用できる強力な手段です。本章では、基本的な自動化の手法から、Cronジョブやスケジューリングライブラリの活用、エラー処理と通知システムの導入まで、幅広い技術を紹介しました。また、実際のプロジェクトにおいてどのようにこれらを応用できるかを、具体的なコード例を通じて解説しました。

スクレイピングの自動化は、時間と手間を節約し、定期的なデータ収集作業を効率化します。特に、価格追跡、ニュース収集、ソーシャルメディアのトレンド分析、競合他社の監視など、ビジネスや個人プロジェクトにおいて大きな利点があります。さらに、エラー処理や通知機能を適切に実装することで、信頼性と安定性を確保しながら自動化されたシステムを運用することが可能です。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

Related Post