跳到内容

简化网页抓取 – 抓取微格式

简化网页抓取 – 抓取微格式

介绍

网络抓取是自动从网站提取数据的过程。它涉及编写能够理解网页结构并提取相关信息的程序。虽然网络抓取对于复杂的网站来说可能具有挑战性,但有一些技术可以使工作变得更容易。其中一种技术是抓取微格式。

微格式以标准化方式提供嵌入 HTML 代码中的语义元数据。它们使程序更容易从网页中提取有意义的信息。在本指南中,我们将学习微格式的基础知识、流行的类型,以及如何利用它们使用 Python 轻松进行网页抓取。

什么是微格式?

创建微格式是为了标准化重要 Web 数据对象的表示,以便机器可读。最常见的是,微格式用于创建网页预览卡。它们最常用于为搜索引擎、社交网络和其他通信渠道提供数据视图。

例如,当您在社交媒体或 Slack 上发布链接时,它会显示带有标题、描述和缩略图的预览卡。这是通过从该页面抓取微格式生成的。

唯一的缺点是微格式不包含整个页面数据集。我们可能需要使用 Beautiful Soup 或 CSS 选择器和 XPath 解析器等工具来通过 HTML 解析来扩展微格式解析器。

流行的微格式类型

网络上使用了多种微格式标准。让我们探索一些流行的类型以及如何使用 Python extruct 库提取它们。

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)

这会输出一个 JSON-LD Person 对象,其中包含 schema.org 字段,如名称、图像、jobTitle 等。

JSON-LD 很容易实现,但可能会不匹配页面数据,因为它与可见数据分开。

微观数据

微数据是第二个最流行的格式,使用 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 属性。它与 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 对象,但很少在网站预览之外使用。

这是一个例子:

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 产品页面的真实示例。

我们将使用 Etsy 产品 API 来获取产品 HTML 并使用 extruct 来提取微格式。

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 这样的网站,产品 JSON-LD 包含最好的数据。 OpenGraph 对于社交网站很有用。

  • 将提取的数据标准化为常规 JSON/dict,以使其更易于处理。

  • 如果需要更多数据,请使用 BeautifulSoup 或类似库扩展解析。

  • 如果网站阻止抓取,请使用代理或 Scrapfly 等工具。

微格式可以轻松地从网页获取结构化数据。将它们集成到您的抓取工具中可以节省大量解析 HTML 的精力。

总结

JSON-LD、Microdata 和 RDFa 等微格式在网页上提供语义结构化数据,以便于提取。

它们允许抓取产品、文章、评论、人员简介等关键信息,而无需复杂的 HTML 解析。

通过使用 extruct 库识别和提取这些格式,我们可以使用 Python 更快地构建可扩展的网络抓取工具。

微格式不会涵盖所有数据,因此需要额外的解析。但它们为强大的刮刀提供了良好的开端。

我希望这篇文章有助于解释抓取微格式以更轻松地提取网络数据的价值!如果您还有其他问题,请告诉我。

标签:

加入谈话

您的电邮地址不会被公开。 必填带 *