Bỏ để qua phần nội dung

Quét web được đơn giản hóa – Quét vi định dạng

Quét web được đơn giản hóa – Quét vi định dạng

Giới thiệu

Quét web là quá trình trích xuất dữ liệu từ các trang web một cách tự động. Nó liên quan đến việc viết các chương trình có thể hiểu cấu trúc trang web và trích xuất thông tin liên quan. Mặc dù việc quét web có thể là thách thức đối với các trang web phức tạp nhưng có một số kỹ thuật nhất định giúp công việc này trở nên dễ dàng hơn. Một kỹ thuật như vậy là cạo các vi định dạng.

Các vi định dạng cung cấp siêu dữ liệu ngữ nghĩa được nhúng trong mã HTML theo cách được tiêu chuẩn hóa. Chúng giúp các chương trình trích xuất thông tin có ý nghĩa từ các trang web dễ dàng hơn. Trong hướng dẫn này, chúng ta sẽ tìm hiểu những kiến ​​thức cơ bản về vi định dạng, các loại phổ biến và cách tận dụng chúng để quét web dễ dàng bằng Python.

Microformat là gì?

Các vi định dạng được tạo ra để chuẩn hóa cách trình bày các đối tượng dữ liệu web quan trọng để chúng có thể đọc được bằng máy. Thông thường nhất, vi định dạng được sử dụng để tạo thẻ xem trước cho các trang web. Chúng được sử dụng phổ biến nhất để cung cấp chế độ xem dữ liệu cho công cụ tìm kiếm, mạng xã hội và các kênh liên lạc khác.

Ví dụ: khi bạn đăng một liên kết lên mạng xã hội hoặc Slack, nó sẽ hiển thị thẻ xem trước có tiêu đề, mô tả và hình thu nhỏ. Điều này được tạo ra bằng cách lấy các vi định dạng từ trang đó.

Nhược điểm duy nhất là vi định dạng không chứa toàn bộ tập dữ liệu trang. Chúng tôi có thể cần mở rộng trình phân tích cú pháp vi định dạng bằng phân tích cú pháp HTML bằng cách sử dụng các công cụ như Beautiful Soup hoặc bộ chọn CSS và trình phân tích cú pháp XPath.

Các loại vi định dạng phổ biến

Có một số tiêu chuẩn microformat được sử dụng trên web. Hãy cùng khám phá một số loại phổ biến và cách trích xuất chúng bằng thư viện trích xuất Python.

JSON-LD

JSON-LD là vi định dạng hiện đại phổ biến nhất. Nó sử dụng các tài liệu JSON được nhúng đại diện trực tiếp cho các đối tượng Schema.org.

Dưới đây là một ví dụ về đánh dấu JSON-LD và cách phân tích cú pháp bằng cách sử dụng trích xuất:

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)

Điều này tạo ra một đối tượng JSON-LD Person với các trường lược đồ.org như tên, hình ảnh, tiêu đề công việc, v.v.

JSON-LD dễ triển khai nhưng có thể không khớp dữ liệu trang vì nó tách biệt với dữ liệu hiển thị.

Microdata

Microdata là định dạng phổ biến thứ hai sử dụng thuộc tính HTML để đánh dấu các trường vi định dạng. Điều này rất tốt cho việc quét web vì nó bao gồm dữ liệu trang hiển thị.

Đây là một ví dụ và cách phân tích nó:

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 khớp với dữ liệu nguồn gần hơn vì nó sử dụng cùng dữ liệu được hiển thị trên trang.

RDFa

RDFa tương tự như Microdata sử dụng thuộc tính HTML cho vi định dạng. Nó có chung những ưu điểm như Microdata.

Đây là một ví dụ:

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)

Dữ liệu RDFa khớp với nguồn thực nhưng đầu ra hơi phức tạp.

OpenGraph

OpenGraph của Facebook được sử dụng để tạo thẻ xem trước trong các bài đăng trên mạng xã hội. Nó hỗ trợ các đối tượng Schema.org nhưng hiếm khi được sử dụng ngoài việc xem trước trang web.

Đây là một ví dụ:

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 có thể khác với dữ liệu trang vì nó không phải là một phần của trang tự nhiên.

Vi định dạng

Microformat là một trong những định dạng lâu đời nhất có trước Schema.org với các lược đồ riêng dành cho con người, tổ chức, sự kiện, sản phẩm, v.v.

Đây là một ví dụ:

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)

Quét vi định dạng trong Python

Hãy xem cách tận dụng các vi định dạng để quét web bằng thư viện trích xuất Python. Chúng tôi sẽ cạo các trang web mẫu bằng cách sử dụng các kỹ thuật được đề cập.

Cài đặt trích xuất bằng cách sử dụng:

pip install extruct

Quét 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)

Điều này sẽ in ra tất cả các đối tượng JSON-LD được nhúng trong trang.

Tương tự, chúng ta có thể cạo các định dạng khác:

# 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 cũng có một phương thức trích xuất thống nhất để trích xuất tất cả các định dạng cùng một lúc:

import extruct

data = extruct.extract(html)
print(data.keys()) # ‘microdata‘, ‘json-ld‘, ‘opengraph‘, etc.

Điều này giúp dễ dàng cạo nhiều vi định dạng một cách hiệu quả.

Ví dụ về trang sản phẩm Etsy

Hãy xem một ví dụ thực tế về việc quét trang sản phẩm Etsy bằng cách sử dụng vi định dạng.

Chúng tôi sẽ sử dụng API sản phẩm Etsy để tìm nạp HTML sản phẩm và trích xuất để trích xuất các vi định dạng.

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"])

Điều này in ra tên sản phẩm, giá, số lượng đánh giá và các trường khác được trích xuất từ ​​JSON-LD.

Chúng tôi có thể tích hợp các kỹ thuật này vào một trình quét web đầy đủ cho bất kỳ trang web nào sử dụng vi định dạng.

Mẹo cạo

Dưới đây là một số mẹo để cạo vi định dạng hiệu quả:

  • Kiểm tra nguồn trang để tìm xem có bất kỳ vi định dạng nào không. Tập trung cạo vào những nơi đông dân nhất.

  • Đối với các trang web như Etsy, Product JSON-LD chứa dữ liệu tốt nhất. OpenGraph rất hữu ích cho các trang xã hội.

  • Chuẩn hóa dữ liệu được trích xuất thành JSON/dict thông thường để xử lý dễ dàng hơn.

  • Mở rộng khả năng phân tích cú pháp bằng BeautifulSoup hoặc các thư viện tương tự nếu cần thêm dữ liệu.

  • Sử dụng proxy hoặc công cụ như Scrapfly nếu trang web chặn hoạt động thu thập thông tin.

Vi định dạng giúp dễ dàng lấy dữ liệu có cấu trúc từ các trang web. Việc tích hợp chúng vào công cụ dọn dẹp của bạn có thể tiết kiệm rất nhiều công sức phân tích cú pháp HTML.

Tổng kết

Các vi định dạng như JSON-LD, Microdata và RDFa cung cấp dữ liệu có cấu trúc ngữ nghĩa trên các trang web để dễ dàng trích xuất.

Chúng cho phép thu thập thông tin quan trọng như sản phẩm, bài viết, bài đánh giá, hồ sơ người dùng, v.v. mà không cần phân tích cú pháp HTML phức tạp.

Bằng cách xác định và trích xuất các định dạng này bằng thư viện trích xuất, chúng ta có thể xây dựng các trình quét web có thể mở rộng nhanh hơn bằng Python.

Các vi định dạng sẽ không bao gồm tất cả dữ liệu nên cần phải phân tích cú pháp bổ sung. Nhưng chúng mang lại sự khởi đầu tuyệt vời cho những người cạo mạnh mẽ.

Tôi hy vọng bài đăng này đã giúp giải thích giá trị của việc loại bỏ các vi định dạng để trích xuất dữ liệu web dễ dàng hơn! Hãy cho tôi biết nếu bạn có bất kì câu hỏi nào khác.

tags:

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *