PythonのRequestsとBeautifulSoupを用いたクォートのスクレイピング
By hientd, at: 2023年6月30日21:55
Estimated Reading Time: __READING_TIME__ minutes


はじめに
ウェブサイトからのデータスクレイピングは、研究からビジネスインテリジェンスまで、さまざまな分野で不可欠なタスクとなっています。この記事では、PythonのRequestsとBeautifulSoupという強力な組み合わせを使用して、人気のウェブサイトhttps://quotes.toscrape.com/から引用句をスクレイピングする手順を説明します。最終的には、ウェブページから特定のコンテンツを効率的に取得して抽出する方法を明確に理解できるようになります。
完全なコードスニペットはこちらにあります。
スクレイピングプロセスの概要
詳細に入る前に、使用するツール、Python RequestsとBeautifulSoupの概要を説明します。
Python Requestsは、HTTPリクエストを簡単に送信できる汎用性の高いライブラリです。
BeautifulSoupは、HTMLとXMLドキュメントを解析するために使用されるPythonライブラリです。
CSVは、csvファイルの読み書きに使用されるPythonライブラリです。
これらの3つのツールを組み合わせることで、ウェブページの構造をナビゲートし、必要な情報を抽出し、ファイルに書き込むことができます。
環境設定
まず、必要なツールがインストールされていることを確認しましょう。これに従うには、Python、Requests、BeautifulSoup、およびCSVが必要です。Pythonがインストールされていない場合は、公式のPythonウェブサイトにアクセスして最新のバージョンをダウンロードしてください。Pythonが設定されたら、ターミナルで次のコマンドを実行してRequestsとBeautifulSoupをインストールできます。
pip install requests
pip install beautifulsoup4
# csvはPythonの組み込みライブラリです
ウェブサイトへのリクエスト
スクレイピングを開始するには、データを取得したいウェブサイトにリクエストを送信する必要があります。Python Requestsを使用すると、引用句ウェブサイトのURLにGETリクエストを送信できます。接続タイムアウトや無効なURL、無効なステータスなどの潜在的なエラーや例外を処理することが重要です。これにより、スクレイピングスクリプトが堅牢で信頼できるようになります。
import requests url = "https://quotes.toscrape.com/"
response = requests.get(url)
if response.status_code == 200:
# スクレイピングを続行します
else:
# エラーを適切に処理します
HTMLレスポンスの解析
ウェブサイトからレスポンスを取得したら、必要な情報を抽出するためにHTMLコンテンツを解析する必要があります。ここでBeautifulSoupが役立ちます。セレクターを使用してHTMLドキュメントをナビゲートおよび検索する便利な方法を提供します。
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
引用句の抽出
BeautifulSoupを使用すると、解析されたHTMLから引用句のテキストと作成者情報を特定して抽出できるようになりました。ウェブページの構造を調べ、適切なHTML要素を特定し、適切なセレクターを使用してデータを取得します。
quotes = soup.select(".quote")
for quote in quotes:
text = quote.select_one(".text").get_text()
author = quote.select_one(".author").get_text()
# スクラップされたデータを必要に応じて処理します
ページネーションの処理
多くの場合、必要なすべてのデータを取得するために複数のページをスクレイピングする必要があります。引用句のウェブサイトには複数のページがあり、引用句を見逃したくありません。ページネーションリンクに従うか、URLのクエリパラメータを変更することで、ページネーションに対処できます。これにより、各ページを繰り返し処理して引用句をスクレイピングできます。
next_page_link = soup.select_one(".next > a")["href"] # 次のページのURLを作成します
next_page_url = f"{url}{next_page_link} # 次のページにGETリクエストを送信し、スクレイピングを続行します
スクレイピングされたデータの保存
引用句を正常にスクレイピングしたら、将来の使用のために抽出されたデータをどのように保存するかを決定することが重要です。CSVファイル、JSON形式に保存するか、データベースに保存するなど、さまざまなオプションがあります。選択は、特定の要件とプロジェクトのスケーラビリティによって異なります。
quotes = [{"author": "Joe", "text": "this is a quote"}]
with open(file_name, 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=["author", "text"])
writer.writeheader()
writer.writerows(quotes)
エッジケースと課題
ウェブスクレイピングは簡単ですが、潜在的なエッジケースと課題に対処することが重要です。
一部のウェブサイトでは、JavaScriptを介してロードされる動的なコンテンツがある場合があります。これには、ヘッドレスブラウザを使用するなど、追加の手法が必要です。この場合、Selenium/PlayWrightを使用してスクレイピングする必要があるかもしれません。
さらに、ウェブサイトでは、CAPTCHAやレート制限(例:https://www.walmart.com/)などのアンチスクレイピング対策が実装されている場合があります。このような課題に対処するには、セッション管理、IPローテーション、専用のスクレイピングフレームワークの使用など、高度な戦略が必要です。
ヒントとベストプラクティス
スムーズで効果的なウェブスクレイピングを確保するために、考慮すべきヒントとベストプラクティスをいくつか示します。
- ウェブサイトのポリシーと利用規約を尊重してください。
- サーバーの過負荷を防ぐために、リクエスト間の遅延メカニズムを含めてください。
- 適切なユーザーエージェントヘッダーを使用して、実際のユーザーの動作を模倣してください。
- 例外を適切に監視および処理して、スクレイピングの中断を防ぎます。
- 潜在的なウェブサイトの変更に適応するために、スクレイピングスクリプトを定期的にテストしてください。
結論
この記事では、PythonのRequestsとBeautifulSoupを使用してhttps://quotes.toscrape.com/から引用句をスクレイピングする方法について説明しました。リクエストの送信、HTMLレスポンスの解析、引用句の抽出、ページネーションの処理、スクレイピングされたデータの保存など、スクレイピングプロセス全体について説明しました。ベストプラクティスに従い、潜在的なエッジケースを考慮することで、特定のニーズに合わせて調整された堅牢で効率的なウェブスクレイピングスクリプトを作成できます。
無料で引用句をスクレイピングできる他の多くのサイトがあります。
- https://www.brainyquote.com/topics/scrape-quotes
- https://www.overallmotivation.com/quotes/scrape-quotes/
- https://bhavyasree.github.io/PythonClass/Notebooks/18.scrape-quotes/
スクリプトの完全な内容は次のとおりです。
# Python 3.11
import argparse
import csv
import requests
from bs4 import BeautifulSoup
BASE_URL = "https://quotes.toscrape.com"
def scrape_url(url):
print(f"URL {url} をスクレイピングしています")
response = requests.get(url)
if response.status_code != 200:
breakpoint()
soup = BeautifulSoup(response.text, "html.parser")
quote_divs = soup.select(".quote")
quotes = []
for quote_div in quote_divs:
text = quote_div.select_one(".text").get_text()
if '"' in text:
text = text.replace('"', "")
if "“" in text:
text = text.replace("“", "")
if "”" in text:
text = text.replace("”", "")
author = quote_div.select_one(".author").get_text()
quote = {"text": text, "author": author}
quotes.append(quote)
print(f"{len(quotes)} 件の引用句が見つかりました")
next_url = None
if soup.select_one(".next > a"):
next_link = soup.select_one(".next > a")["href"]
next_url = f"{BASE_URL}{next_link}"
return next_url, quotes
def write_to_file(file_name, quotes):
field_names = ["author", "text"]
with open(file_name, "w") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=field_names)
writer.writeheader()
writer.writerows(quotes)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="引用句をスクレイピングします")
parser.add_argument("-f", "--file_name")
args = parser.parse_args()
file_name = "quotes.csv"
if args.file_name:
file_name = args.file_name
print("スクレイピングを開始します")
next_url = "https://quotes.toscrape.com/"
quotes = []
while next_url:
next_url, new_quotes = scrape_url(next_url)
quotes.extend(new_quotes)
print(f"合計{len(quotes)}件が見つかりました")
write_to_file(file_name, quotes)
よくある質問
-
どのウェブサイトでもスクレイピングできますか? ウェブスクレイピングはほとんどのウェブサイトで技術的に可能ですが、ウェブサイトの利用規約とポリシーを確認することが重要です。一部のウェブサイトでは、スクレイピングを明示的に禁止しているか、特定の制限があります。
-
動的なコンテンツを持つウェブサイトをどのように処理できますか? JavaScriptを使用して動的にデータを読み込むウェブサイトでは、ヘッドレスブラウザを使用したり、APIエンドポイントをリバースエンジニアリングしたりするなど、追加の手法が必要になる場合があります。
-
ウェブスクレイピングは合法ですか? ウェブスクレイピングの合法性は、ウェブサイトの利用規約、適用される法律、スクレイピングの目的など、さまざまな要因によって異なります。コンプライアンスを確保するには、法律専門家に相談するか、地域の規制を確認することをお勧めします。
-
CAPTCHAなどのアンチスクレイピング対策をどのように処理できますか? 一部のウェブサイトでは、自動アクセスを防ぐためにCAPTCHAなどのアンチスクレイピング対策が使用されています。このような場合は、追加のツールやサービスを使用してこれらの対策を回避する必要がある場合があります。
-
ウェブスクレイピングでサーバーに過負荷がかかり、問題が発生する可能性はありますか? はい、過剰なスクレイピングはサーバーに負担をかけ、ウェブサイトのパフォーマンスに影響を与える可能性があります。責任あるスクレイピングを行い、サーバーの過負荷を防ぐために、遅延、スロットリング、その他の対策を実装することが重要です。
-
ウェブサイトをスクレイピングする際の倫理的な考慮事項は何ですか? ウェブサイトをスクレイピングする際には、ウェブサイトのポリシー、利用規約、プライバシーに関する考慮事項を尊重することが重要です。適切な同意なしに、機密情報または個人情報をスクレイピングしないでください。
-
Pythonでのウェブスクレイピングの代替ライブラリは何ですか? RequestsとBeautifulSoupに加えて、Pythonでのウェブスクレイピングの人気のある他のライブラリには、Scrapy、Selenium、lxmlなどがあります。ライブラリの選択は、スクレイピングタスクの特定の要件と複雑さによって異なります。
-
ログイン/認証によって保護されたウェブサイトをスクレイピングできますか? 認証済みまたはログインで保護されたウェブサイトをスクレイピングするには、適切なセッションCookieを送信したり、APIエンドポイントを使用したりするなど、追加の手順が必要です。スクレイピングを試みる前に、ウェブサイトの認証メカニズムを理解することが重要です。
-
スクレイピングされたデータをどのように保存して分析できますか? スクラップされたデータは、CSV、JSON、データベースなどのさまざまな形式で保存して、さらに分析できます。Pythonには、データの操作と分析のためのpandasなどの多くのライブラリがあります。
-
ウェブサイトの構造の変更をどのように処理できますか? ウェブサイトは時間の経過とともにHTML構造が変更される可能性があり、スクレイピングスクリプトが壊れる可能性があります。スクレイピングロジックを定期的にレビューおよび更新すると、対処できます