Упрощенный парсинг веб-страниц – парсинг микроформатов
Введение
Веб-скрапинг — это процесс автоматического извлечения данных с веб-сайтов. Он включает в себя написание программ, которые могут понимать структуру веб-страниц и извлекать соответствующую информацию. Хотя парсинг сложных веб-сайтов может оказаться сложной задачей, существуют определенные методы, которые облегчают работу. Одним из таких методов является очистка микроформатов.
Микроформаты предоставляют семантические метаданные, встроенные в HTML-код стандартизированным способом. Они облегчают программам извлечение значимой информации с веб-страниц. В этом руководстве мы изучим основы микроформатов, популярные типы и способы их использования для легкого парсинга веб-страниц с помощью Python.
Что такое микроформаты?
Микроформаты были созданы для стандартизации представления важных объектов веб-данных, чтобы они могли быть машиночитаемыми. Чаще всего микроформаты используются для создания карточек предварительного просмотра веб-страниц. Чаще всего они используются для предоставления представлений данных для поисковых систем, социальных сетей и других каналов связи.
Например, когда вы публикуете ссылку в социальных сетях или Slack, отображается карточка предварительного просмотра с заголовком, описанием и миниатюрой. Это генерируется путем очистки микроформатов с этой страницы.
Единственным недостатком является то, что микроформаты не содержат весь набор данных страницы. Возможно, нам придется расширить анализатор микроформатов, добавив в него анализ HTML, используя такие инструменты, как Beautiful Soup или селектор CSS и анализаторы XPath.
Популярные типы микроформатов
В сети используется несколько стандартов микроформатов. Давайте рассмотрим некоторые популярные типы и способы их извлечения с помощью библиотеки извлечений Python.
JSON-LD
JSON-LD — самый популярный современный микроформат. Он использует встроенные документы JSON, которые напрямую представляют объекты Schema.org.
Вот пример разметки 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)
В результате выводится объект Person JSON-LD с полями Schema.org, такими как имя, изображение, jobTitle и т. д.
JSON-LD легко реализовать, но он может не соответствовать данным страницы, поскольку он отделен от видимых данных.
Microdata
Микроданные — второй по популярности формат, использующий атрибуты HTML для разметки полей микроформата. Это отлично подходит для парсинга веб-страниц, поскольку охватывает видимые данные страницы.
Вот пример и как его разобрать:
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)
Микроданные ближе соответствуют исходным данным, поскольку используют те же данные, что отображаются на странице.
RDFa
RDFa похож на микроданные, используя атрибуты HTML для микроформатов. Он имеет те же преимущества, что и микроданные.
Вот пример:
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
OpenGraph от Facebook используется для создания карточек предварительного просмотра в сообщениях в социальных сетях. Он поддерживает объекты Schema.org, но редко используется за пределами предварительного просмотра веб-сайта.
Вот пример:
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 может отличаться от данных страницы, поскольку он не является частью обычной страницы.
Микроформат
Микроформат — один из старейших форматов, предшествовавший Schema.org, со своими собственными схемами для людей, организаций, событий, продуктов и т. д.
Вот пример:
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. Мы очистим образцы сайтов, используя описанные методы.
Установите экстракт, используя:
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 с использованием микроформатов.
Мы будем использовать API продукта Etsy для получения 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.
Мы можем интегрировать эти методы в полноценный парсер для любого сайта, использующего микроформаты.
Советы по очистке
Вот несколько советов по эффективному парсингу микроформатов:
Проверьте исходный код страницы, чтобы определить наличие каких-либо микроформатов. Сосредоточьтесь на наиболее посещаемых из них.
Для таких сайтов, как Etsy, Product JSON-LD содержит лучшие данные. OpenGraph полезен для социальных сайтов.
Нормализуйте извлеченные данные в обычные JSON/dicts, чтобы их было легче обрабатывать.
Расширьте анализ с помощью BeautifulSoup или аналогичных библиотек, если требуется больше данных.
Используйте прокси или такие инструменты, как Scrapfly, если сайт блокирует парсинг.
Микроформаты упрощают получение структурированных данных с веб-страниц. Интеграция их в ваши парсеры может сэкономить много усилий при анализе HTML.
Обзор
Микроформаты, такие как JSON-LD, Microdata и RDFa, предоставляют семантически структурированные данные на веб-страницах для облегчения их извлечения.
Они позволяют собирать ключевую информацию, такую как продукты, статьи, обзоры, профили людей и т. д., без сложного анализа HTML.
Идентифицируя и извлекая эти форматы с помощью библиотеки extruct, мы можем быстрее создавать масштабируемые веб-скребки с помощью Python.
Микроформаты не охватывают все данные, поэтому необходим дополнительный анализ. Но они обеспечивают отличный старт для надежных скреперов.
Я надеюсь, что этот пост помог объяснить ценность очистки микроформатов для упрощения извлечения веб-данных! Дайте мне знать, если у вас есть еще вопросы.