PythonとRequests-HTMLを使ったWebスクレイピング
PythonとRequests-HTMLを使ったWebスクレイピング
スクレイピングを始めたばかりの方でも、より強力なツールを探している方でも、requests-HTMLを使えば、必要なデータを簡単かつ効率的に取得できます。それでは、始めましょう!
Webスクレイピングとは?
Webスクレイピングとは、ウェブページからデータを抽出するプロセスを指します。これは、ウェブページにHTTPリクエストを送り、HTMLコンテンツをダウンロードし、必要な情報を抽出するために解析することで行われます。このデータは、記事のタイトルからリンク、商品価格まで、何でもかまいません。
最も基本的な形では、Webスクレイピングは3つの主要なステップで構成されています:
- HTTPリクエストの送信:これは、ウェブサイトにコンテンツ(通常はHTMLページ)を要求する最初のステップです。
- HTMLの解析:HTMLコンテンツを取得したら、意味のあるデータを抽出するために解析する必要があります。私の記事最良のPython HTMLパーサーを読んでください。
- データの保存:最後に、抽出したデータをCSVやJSONなどの形式で保存し、さらに分析できるようにします。
Webスクレイピングにrequests-HTMLを選ぶ理由
Pythonには、requestsやBeautifulSoup、Seleniumなど、Webスクレイピング用の多くのライブラリがあります。それでは、なぜrequests-HTMLを使用するべきなのでしょうか?
requests-HTMLがスクレイピングに適したツールである理由は以下の通りです:
- JavaScriptレンダリング:今日の多くのウェブサイトは、コンテンツを読み込むためにJavaScriptに依存しています。静的なHTMLのみを取得する基本的なHTTPリクエストとは異なり、requests-HTMLはJavaScriptをレンダリングできるため、ページ上で動的に読み込まれるコンテンツをスクレイピングできます。
- シンプルなAPI:APIは非常にシンプルで理解しやすいです。requestsに慣れている方は、requests-HTMLをすぐに使いこなせるでしょう。
- 組み込みの解析機能:requests-HTMLには、CSSセレクタやXPath式を使用してHTMLから特定のデータを抽出できる組み込みのHTML解析メソッドが含まれています。
requests-HTMLのインストール
requests-HTMLを使い始めるには、まずインストールする必要があります。これはpipパッケージマネージャを使用して行えます。ターミナルを開いて、次のコマンドを入力してください:
pip install requests-html
大量のデータを扱う予定がある場合は、pandasもインストールしておくと良いでしょう:
pip install pandas
インストールが完了したら、Pythonスクリプトでrequests-HTMLを使い始めることができます。
セッションの設定
requests-HTMLを使用する際に最初に行うべきことは、セッションを作成することです。セッションは、セッション中に行うすべてのリクエストを追跡するオブジェクトです。セッションを作成するには、requests_htmlモジュールからHTMLSessionクラスをインポートする必要があります。
セッションを設定し、GETリクエストを送信する方法は以下の通りです:
from requests_html import HTMLSession
# Create a session
session = HTMLSession()
# Send a GET request to the URL
url = "https://example.com"
response = session.get(url)
レスポンスオブジェクトには、リクエストしたウェブページのHTMLコンテンツが含まれています。これを解析して有用な情報を抽出できます。
HTMLコンテンツの解析
HTMLコンテンツを受け取ったら、次のステップはそれを解析することです。requests-HTMLの組み込みのfind()メソッドを使用すると、CSSセレクタを使って要素を抽出できます。また、xpath()メソッドを使用してXPath式で要素を抽出することもできます。
例えば、ウェブページのタイトルを抽出したい場合は、次のようにします:
# Find the title element and get the text
title = response.html.find('title', first=True).text
print(title)
In this example, the find() method locates the <title> element, and the first=True argument ensures that it only returns the first matching element. The text attribute is used to retrieve the content inside the <title> tag.
メタ情報の抽出
タイトルの他にも、メタディスクリプション、キーワード、またはカノニカルリンクなど、抽出したい重要な情報があります。
以下は、xpath()を使用してページのメタディスクリプションを抽出する方法です。
# Extract the meta description using XPath
meta_desc = response.html.xpath('//meta[@name="description"]/@content')
print(meta_desc)
これにより、メタタグの内容が出力されます。
ページからリンクを抽出する
ページからすべてのリンクを抽出することは、ウェブスクレイピングでよくある作業です。requests-HTMLは、ウェブページ上のすべてのリンクを簡単に取得する方法を提供します。
absolute_linksメソッドを使用して、すべての絶対リンク(URL)のリストを取得できます。
# Get all the absolute links on the page
links = response.html.absolute_links
for link in links:
print(link)
これにより、ページ上のすべてのリンクが出力されます。
JavaScriptレンダリングされたコンテンツの扱い
requests-HTMLの主な機能の1つは、JavaScriptレンダリングされたコンテンツを扱う能力です。多くの現代のウェブサイトは、コンテンツを動的に読み込むためにJavaScriptを使用しています。これは、基本的なHTTPリクエストを送信するだけでは、望むすべてのデータを取得できない可能性があることを意味します。
Get Data Journal’s stories in your inbox
Join Medium for free to get updates from this writer.
これを解決するために、requests-HTMLはrender()というメソッドを提供しており、バックグラウンドでJavaScriptを実行してレンダリングされたコンテンツを取得できます。Jupyterノートブックを使用している場合は、非同期レンダリングのためにarender()を使用できます。
以下は、JavaScriptコンテンツをレンダリングする方法の例です。
# Render JavaScript content
response.html.render()
# Now you can extract the data
content = response.html.find('h1', first=True)
print(content.text)
これにより、ページのJavaScriptがレンダリングされ、単純なHTTPリクエストでは取得できないコンテンツをスクレイピングできるようになります。
XPathとCSSセレクタの使用
ウェブスクレイピングでは、XPathとCSSセレクタはデータを抽出するための最も一般的な方法の2つです。requests-HTMLでは、両方を使用できます。
- CSSセレクタ: find()をCSSセレクタと共に使用して要素を見つけます。
# Find all the links using a CSS selector
links = response.html.find('a')
for link in links:
print(link.attrs['href'])
XPath: xpath()を使用してXPath式で要素を選択します。
# Extract all the links using XPath
links = response.html.xpath('//a/@href')
for link in links:
print(link)
ネストされた情報の抽出
時には、探しているデータが他の要素内にネストされていることがあります。たとえば、ページの特定のセクション内に表示されるすべてのリンクを抽出したい場合があります。
これを行うには、CSSセレクタまたはXPath式の組み合わせを使用できます。以下は、特定の
# Extract links within a specific div
div_content = response.html.find('div.content', first=True)
links = div_content.xpath('//a/@href')
for link in links:
print(link)
スクレイピングしたデータの保存
データを抽出した後、通常はCSV、JSON、またはデータベースなどの構造化された形式で保存したいと思います。
たとえば、リンクのリストをスクレイピングしている場合、CSVファイルに保存できます。
import csv
# Write links to a CSV file
with open('links.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Link'])
for link in links:
writer.writerow([link])
これにより、すべてのリンクがlinks.csvという名前のファイルに保存されます。
エラーの処理
ウェブスクレイピングは、ネットワークの問題、無効なURL、またはウェブサイトの予期しない変更により失敗することがあります。コード内でエラーを適切に処理することが重要です。
例として、try-exceptブロックを使用して例外をキャッチできます:
try:
response = session.get(url)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Error fetching the URL: {e}")
結論
requests-HTMLを使用したウェブスクレイピングは、ウェブサイトからデータを収集するための簡単で効果的な方法です。コンテンツが静的であれ、JavaScriptでレンダリングされていようと、requests-HTMLは必要なものを正確に取得するためのシンプルなAPIを提供します。pandasのようなツールと組み合わせることで、生データを迅速に分析に役立つ洞察に変えることができます。
ただし、スクレイピングを行う際には常に倫理的ガイドラインに従うことが重要です。ウェブサイトのrobots.txtファイルを確認して、サーバーに過負荷をかけたり、ルールを破ったりしていないことを確認してください。
requests-HTMLを使用することで、データ抽出のプロセスを自動化し、ウェブからの情報収集と分析を大規模に行いやすくなります。
他のウェブスクレイピングガイドに興味がありますか?
- Web Scraping With Scrapy
- Web Scraping With Selenium
- JavaScript vs. Python for Web Scraping
- Web Scraping With Python lxml
- Web Scraping With Excel
- Web Scraping With Python
- Web Scraping With C#
- Scraping Amazon Best Sellers
- Web Scraping With Google Sheets
- Bypass Cloudflare for Web Scraping
- Throttling Requests Guide
