перейти к содержанию

Упрощенный парсинг веб-страниц – парсинг микроформатов

Упрощенный парсинг веб-страниц – парсинг микроформатов

Введение

Веб-скрапинг — это процесс автоматического извлечения данных с веб-сайтов. Он включает в себя написание программ, которые могут понимать структуру веб-страниц и извлекать соответствующую информацию. Хотя парсинг сложных веб-сайтов может оказаться сложной задачей, существуют определенные методы, которые облегчают работу. Одним из таких методов является очистка микроформатов.

Микроформаты предоставляют семантические метаданные, встроенные в 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.

Микроформаты не охватывают все данные, поэтому необходим дополнительный анализ. Но они обеспечивают отличный старт для надежных скреперов.

Я надеюсь, что этот пост помог объяснить ценность очистки микроформатов для упрощения извлечения веб-данных! Дайте мне знать, если у вас есть еще вопросы.

Теги:

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *