簡素化された Web スクレイピング – マイクロフォーマットのスクレイピング
概要
Web スクレイピングは、Web サイトからデータを自動的に抽出するプロセスです。これには、Web ページの構造を理解し、関連する情報を抽出できるプログラムを作成することが含まれます。 Web スクレイピングは複雑な Web サイトでは難しい場合がありますが、作業を容易にする特定のテクニックがあります。そのような手法の 1 つは、マイクロフォーマットのスクレイピングです。
マイクロフォーマットは、標準化された方法で HTML コード内に埋め込まれたセマンティック メタデータを提供します。これにより、プログラムが Web ページから意味のある情報を抽出しやすくなります。このガイドでは、マイクロフォーマットの基本、一般的なタイプ、および Python を使用して簡単に Web スクレイピングを行うためにマイクロフォーマットを活用する方法を学びます。
マイクロフォーマットとは何ですか?
マイクロフォーマットは、重要な Web データ オブジェクトの表現を標準化し、機械可読にするために作成されました。最も一般的には、マイクロフォーマットは Web ページのプレビュー カードを作成するために使用されます。これらは、検索エンジン、ソーシャル ネットワーク、その他の通信チャネルにデータ ビューを提供するために最も一般的に使用されます。
たとえば、ソーシャル メディアや Slack にリンクを投稿すると、タイトル、説明、サムネイルを含むプレビュー カードが表示されます。これは、そのページからマイクロフォーマットをスクレイピングすることによって生成されます。
唯一の欠点は、マイクロフォーマットにはページ データセット全体が含まれていないことです。 Beautiful Soup や CSS セレクター、XPath パーサーなどのツールを使用して、HTML 解析でマイクロフォーマット パーサーを拡張する必要がある場合があります。
一般的なマイクロフォーマットのタイプ
Web 上では、いくつかのマイクロフォーマット標準が使用されています。いくつかの人気のある型と、Python 抽出ライブラリを使用してそれらを抽出する方法を調べてみましょう。
JSON-LD
JSON-LD は、最も人気のある最新のマイクロフォーマットです。 schema.org オブジェクトを直接表す埋め込み JSON ドキュメントを使用します。
JSON-LD マークアップの例と、extruct を使用してそれを解析する方法を次に示します。
import extruct
html = """<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Person",
"name": "John Doe",
"image": "johndoe.jpg",
"jobTitle": "Software Engineer",
"telephone": "(555) 555-5555",
"email": "[email protected]",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "Anytown",
"addressRegion": "CA",
"postalCode": "12345"
}
}
</script>"""
data = extruct.JsonLdExtractor().extract(html)
print(data)
これにより、name、image、jobTitle などの schema.org フィールドを含む JSON-LD Person オブジェクトが出力されます。
JSON-LD は実装が簡単ですが、表示されるデータから分離されているため、ページ データが不一致になる可能性があります。
マイクロデータ
microdata は、HTML 属性を使用して microformat フィールドをマークアップする 2 番目に人気のある形式です。これは、表示されているページデータをカバーするため、Web スクレイピングに最適です。
以下にその例と解析方法を示します。
html = """<div itemscope itemtype="http://schema.org/Person">
<h1 itemprop="name">John Doe</h1>
<img itemprop="image" src="johndoe.jpg" alt="John Doe">
<p itemprop="jobTitle">Software Engineer</p>
<p itemprop="telephone">(555) 555-5555</p>
<p itemprop="email"><a href="mailto:[email protected]">[email protected]</a></p>
<div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
<p>
<span itemprop="streetAddress">123 Main St</span>,
<span itemprop="addressLocality">Anytown</span>,
<span itemprop="addressRegion">CA</span>
<span itemprop="postalCode">12345</span>
</p>
</div>
</div>"""
data = extruct.MicrodataExtractor().extract(html)
print(data)
Microdata は、ページに表示されているものと同じデータを使用するため、ソース データとより一致します。
RDFa
RDFa は、マイクロフォーマットの HTML 属性を使用する Microdata に似ています。 Microdata と同じ利点を共有します。
以下に例を示します。
html = """<div vocab="http://schema.org/" typeof="Person">
<h1 property="name">John Doe</h1>
<img property="image" src="johndoe.jpg" alt="John Doe"/>
<p property="jobTitle">Software Engineer</p>
<p property="telephone">(555) 555-5555</p>
<p property="email"><a href="mailto:[email protected]">[email protected]</a></p>
<div property="address" typeof="PostalAddress">
<p>
<span property="streetAddress">123 Main St</span>,
<span property="addressLocality">Anytown</span>,
<span property="addressRegion">CA</span>
<span property="postalCode">12345</span>
</p>
</div>
</div>"""
data = extruct.RDFaExtractor().extract(html)
print(data)
RDFa データは実際のソースと一致しますが、出力は少し複雑です。
OpenGraph
Facebook の OpenGraph は、ソーシャル投稿でプレビュー カードを生成するために使用されます。 schema.org オブジェクトをサポートしていますが、Web サイトのプレビュー以外ではほとんど使用されません。
以下に例を示します。
html = """<head>
<meta property="og:type" content="profile"/>
<meta property="og:title" content="John Doe"/>
<meta property="og:image" content="johndoe.jpg"/>
<meta property="og:description" content="Software Engineer"/>
<meta property="og:phone_number" content="(555) 555-5555"/>
<meta property="og:email" content="[email protected]"/>
<meta property="og:street-address" content="123 Main St"/>
<meta property="og:locality" content="Anytown"/>
<meta property="og:region" content="CA"/>
<meta property="og:postal-code" content="12345"/>
</head>"""
data = extruct.OpenGraphExtractor().extract(html)
print(data)
Opengraph は、自然なページの一部ではないため、ページ データとは異なる場合があります。
マイクロフォーマット
Microformat は、人、組織、イベント、製品などのための独自のスキーマを持つ schema.org よりも古いフォーマットの 1 つです。
以下に例を示します。
html = """<div class="h-card">
<h1 class="fn">John Doe</h1>
<img class="photo" src="johndoe.jpg" alt="John Doe">
<p class="title">Software Engineer</p>
<p class="tel">(555) 555-5555</p>
<a class="email" href="mailto:[email protected]">[email protected]</a>
<div class="adr">
<span class="street-address">123 Main St</span>,
<span class="locality">Anytown</span>,
<span class="region">CA</span>
<span class="postal-code">12345</span>
</div>
</div>"""
data = extruct.MicroformatExtractor().extract(html)
print(data)
Python でのマイクロフォーマットのスクレイピング
Python 抽出ライブラリを使用して、Web スクレイピングにマイクロフォーマットを活用する方法を見てみましょう。取り上げたテクニックを使用してサンプル サイトをスクレイピングします。
以下を使用して抽出をインストールします。
pip install extruct
JSON-LDのスクレイピング:
import extruct
import requests
url = "https://example.com"
# Fetch HTML
response = requests.get(url)
html = response.text
# Extract JSON-LD
data = extruct.JsonLdExtractor().extract(html)
print(data)
これにより、ページに埋め込まれているすべての JSON-LD オブジェクトが出力されます。
同様に、他の形式もスクレイピングできます。
# Microdata
data = extruct.MicrodataExtractor().extract(html)
# RDFa
data = extruct.RDFaExtractor().extract(html)
# OpenGraph
data = extruct.OpenGraphExtractor().extract(html)
# Microformat
data = extruct.MicroformatExtractor().extract(html)
extruct には、すべての形式を一度に抽出する統合された抽出メソッドもあります。
import extruct
data = extruct.extract(html)
print(data.keys()) # ‘microdata‘, ‘json-ld‘, ‘opengraph‘, etc.
これにより、複数のマイクロフォーマットを効率的にスクレイピングすることが簡単になります。
Etsy 製品ページのスクレイピングの例
マイクロフォーマットを使用して Etsy 製品ページをスクレイピングする実際の例を見てみましょう。
Etsy 製品 API を使用して製品 HTML を取得し、抽出してマイクロフォーマットを抽出します。
import requests
import extruct
product_id = "1214112656"
# Fetch product HTML
url = f"https://www.etsy.com/listing/{product_id}"
response = requests.get(url)
html = response.text
# Extract all microformats
data = extruct.extract(html)
print(data.keys())
# Get JSON-LD product
product = next(obj for obj in data["json-ld"] if obj["@type"] == "Product")
# Print selected fields:
print(product["name"])
print(product["price"])
print(product["reviewCount"])
これにより、JSON-LD から抽出された製品名、価格、レビュー数、およびその他のフィールドが出力されます。
これらの技術を、マイクロフォーマットを使用するあらゆるサイト向けの完全な Web スクレイパーに統合できます。
スクレーピングのヒント
マイクロフォーマットのスクレイピングを効果的に行うためのヒントをいくつか紹介します。
ページのソースを調べて、マイクロフォーマットが存在するかどうかを確認します。最も人口の多いものに焦点を当ててスクレイピングします。
Etsy のようなサイトの場合、Product JSON-LD に最適なデータが含まれています。 OpenGraph はソーシャル サイトに役立ちます。
抽出されたデータを通常の JSON/dict に正規化して、処理しやすくします。
さらに多くのデータが必要な場合は、BeautifulSoup または同様のライブラリを使用して解析を拡張します。
サイトがスクレイピングをブロックする場合は、プロキシまたは Scrapfly などのツールを使用します。
マイクロフォーマットを使用すると、Web ページから構造化データを簡単に取得できます。これらをスクレイパーに統合すると、HTML を解析する労力を大幅に節約できます。
まとめ
JSON-LD、Microdata、RDFa などのマイクロフォーマットは、簡単に抽出できるように Web ページ上にセマンティック構造化データを提供します。
複雑な HTML 解析を行わずに、製品、記事、レビュー、人物プロフィールなどの重要な情報をスクレイピングできます。
extruct ライブラリを使用してこれらの形式を識別して抽出することで、Python を使用してスケーラブルな Web スクレイパーをより速く構築できます。
マイクロフォーマットはすべてのデータをカバーするわけではないため、追加の解析が必要です。しかし、堅牢なスクレーパーにとっては非常に有利なスタートとなります。
この投稿が、Web データ抽出を容易にするためにマイクロフォーマットをスクレイピングすることの価値を説明するのに役立つことを願っています。他にご質問がございましたらお知らせください。