0
0
Lập trình
Admin Team
Admin Teamtechmely

Web Scraping Bất Đồng Bộ với scrapy_cffi

Đăng vào 1 tuần trước

• 5 phút đọc

Giới Thiệu

scrapy_cffi là một framework web scraping nhẹ với ưu tiên bất đồng bộ, tuân theo kiến trúc kiểu Scrapy.
Nó được thiết kế cho các nhà phát triển muốn có một quy trình thu thập dữ liệu quen thuộc, nhưng với hỗ trợ đầy đủ asyncio, các tiện ích mô-đun và các điểm tích hợp linh hoạt.

Framework sử dụng curl_cffi làm HTTP client mặc định—API giống như requests nhưng mạnh mẽ hơn—nhưng lớp yêu cầu được tách biệt hoàn toàn khỏi engine, cho phép dễ dàng thay thế bằng các thư viện HTTP khác trong tương lai.

Ngay cả khi bạn không cần một crawler đầy đủ, nhiều thư viện tiện ích có thể được sử dụng độc lập.

💡 Thân thiện với IDE: Framework nhấn mạnh vào việc hoàn thành mã, gợi ý kiểu, và tạo cài đặt lập trình, giúp phát triển và gỡ lỗi mượt mà hơn trong các IDE Python hiện đại.


Tại Sao Chọn scrapy_cffi?

scrapy_cffi được thiết kế với một số nguyên tắc cốt lõi:

  • API-first & Modular: Tất cả spider, pipeline, và tác vụ đều có thể truy cập hoàn toàn qua các giao diện Python. CLI là tùy chọn, và cài đặt được tạo ra một cách lập trình để hỗ trợ cả chế độ thực thi spider đơn lẻ và lô.
  • Thực Thi Bất Đồng Bộ: Engine hoàn toàn dựa trên asyncio cho phép xử lý đồng thời cao, hỗ trợ HTTP + WebSocket, và tích hợp mượt mà với các quy trình làm việc bất đồng bộ.
  • Kiến Trúc Kiểu Scrapy: Quy trình spider, pipeline và hooks giống như Scrapy, giúp người dùng Scrapy hiện tại dễ dàng chuyển đổi.
  • Lớp Yêu Cầu Tách Biệt: Mặc định, curl_cffi được sử dụng, nhưng bộ lập lịch và engine độc lập với HTTP client. Điều này cho phép linh hoạt trong việc thay thế các thư viện yêu cầu mà không cần chạm vào lõi của crawler.
  • Tiện Ích Trước Hết: Các thành phần như HTTP, WebSocket, xử lý media, phân tích JSON, và các adapter cơ sở dữ liệu có thể được sử dụng độc lập, hỗ trợ cho các script nhỏ hoặc các crawler bất đồng bộ toàn diện.

✨ Tính Năng Nổi Bật

  • 🕸️ Các thành phần theo kiểu Scrapy: spiders, items, pipelines, interceptors
  • ⚡ Engine hoàn toàn dựa trên asyncio cho khả năng xử lý đồng thời cao
  • 🌐 Hỗ trợ HTTP & WebSocket với TLS
  • 🔔 Hệ thống tín hiệu nhẹ
  • 🔌 Quản lý tác vụ và interceptor sẵn sàng cho plug-in
  • 🗄️ Bộ lập lịch tương thích với Redis (tùy chọn)
  • 💾 Các adapter tích hợp cho Redis, MySQL, và MongoDB với khả năng tự động thử lại & kết nối lại

🚀 Bắt Đầu Nhanh

Copy
# Cài đặt
pip install scrapy_cffi

# Tạo một dự án mới
scrapy-cffi startproject myproject
cd myproject

# Tạo một spider
scrapy-cffi genspider myspider example.com

# Chạy crawler của bạn
python runner.py

Lưu ý: Lệnh CLI đã thay đổi từ scrapy_cffi (≤0.1.4) sang scrapy-cffi (>0.1.4).
scrapy_cffi sử dụng việc tạo cài đặt lập trình và thiết kế API-first, framework không phụ thuộc vào CLI để thực thi spider.

Tài liệu đầy đủ: docs/

⭐ Đánh dấu & đóng góp trên GitHub: scrapy_cffi

⚡ Các Tiện Ích Hữu Ích

scrapy_cffi cung cấp một số tính năng tập trung vào tiện ích và bất đồng bộ giúp việc thu thập dữ liệu và tổ chức tác vụ bất đồng bộ dễ dàng hơn:

Crawling Bất Đồng Bộ

  • Hỗ trợ cả async def async generators và các generators đồng bộ theo kiểu Scrapy.
  • Thực thi hoàn toàn dựa trên asyncio với khả năng xử lý đồng thời cao.

ResultHolder

  • Tập hợp nhiều kết quả yêu cầu trước khi tạo ra lô tiếp theo.
  • Hữu ích cho các quy trình làm việc đa giai đoạn và các tác vụ phân tán.

Hệ Thống Hooks

  • Truy cập an toàn vào các phiên, bộ lập lịch hoặc các hệ thống con khác.
  • Hỗ trợ nhiều người dùng cookies và xoay vòng phiên.

Yêu Cầu HTTP + WebSocket

  • Gửi yêu cầu HTTP & WebSocket trong một Spider duy nhất.
  • Hỗ trợ TLS bao gồm.
  • Các tính năng nâng cao của curl_cffi: xác thực TLS/JA3, kiểm soát proxy, API HTTP/WS thống nhất.

Tiện Ích Yêu Cầu & Phản Hồi

  • HttpRequest / WebSocketRequest với mã hóa Protobuf & gRPC tùy chọn.
  • MediaRequest cho tải xuống phân đoạn (video, tệp lớn).
  • HttpResponse selector với .css(), .xpath(), .re().
  • Khai thác JSON mạnh mẽ:
    • extract_json() cho JSON chuẩn.
    • extract_json_strong() cho JSON bị lỗi hoặc nhúng.
  • Giải mã Protobuf / gRPC từ các phản hồi HTTP hoặc WebSocket.

Hỗ Trợ Cơ Sở Dữ Liệu

Các adapter tích hợp với khả năng tự động thử lại & kết nối lại:

  • RedisManager (tương thích với redis.asyncio.Redis)
  • SQLAlchemyMySQLManager (engine & session SQLAlchemy bất đồng bộ, API gốc được hỗ trợ)
  • MongoDBManager (client Motor bất đồng bộ, API gốc được hỗ trợ)

Ví dụ sử dụng MongoDB & MySQL:
MongoDB
MySQL

RPC Đa Quy Trình với ProcessManager

scrapy_cffi bao gồm một ProcessManager nhẹ cho việc đăng ký RPC đa quy trình nhanh chóng.
Điều này lý tưởng cho các dự án nhỏ hoặc gỡ lỗi mà không phụ thuộc vào MQ/Redis, nhưng không được khuyến nghị cho sản xuất.

  • Hỗ trợ đăng ký hàm, lớp, và đối tượng cho các cuộc gọi từ xa.
  • Cho phép khởi động một máy chủ để công khai các phương thức đã đăng ký và một khách hàng để kết nối và gọi chúng.
  • Chạy mỗi hàm đã đăng ký trong một quy trình riêng nếu cần, với tùy chọn thu hồi kết quả.
  • Hoạt động trên đa nền tảng, nhưng Windows có một số hạn chế Ctrl+C do khởi động quy trình.
Copy
from scrapy_cffi.utils import ProcessManager

# Đăng ký các phương thức
def hello(name: str):
    return f"Xin chào, {name}!"

class Greeter:
    def greet(self, msg: str):
        return f"Chào mừng: {msg}"

class Counter:
    def __init__(self):
        self.value = 0
    def inc(self):
        self.value += 1
        return self.value
    def get(self):
        return self.value

counter = Counter()

# Khởi động máy chủ
manager = ProcessManager(register_methods={
    "hello": hello,
    "Greeter": Greeter,
    "counter": counter
})
manager.start_server(run_mode=0)  # chế độ chặn

# Khởi động khách hàng
manager.start_client()
print(manager.hello("Thế giới"))
c = manager.counter()
print(c.inc())
g = manager.Greeter()
print(g.greet("Chào"))

Mẹo: ProcessManager được thiết kế cho prototyping nhanh và các tác vụ quy mô nhỏ. Đối với các hệ thống phân tán cấp sản xuất, hãy xem xét sử dụng một hàng đợi tin nhắn hoặc framework RPC đầy đủ tính năng.

scrapy_cffi hiện đang trong quá trình phát triển. Thiết kế modular và API-first cho phép các nhà phát triển sử dụng nó như một framework kiểu Scrapy hoàn chỉnh hoặc chọn các tiện ích riêng lẻ cho các tác vụ thu thập dữ liệu nhỏ, bất đồng bộ. Mục tiêu cuối cùng là độ linh hoạt cao, tiện ích độc lập và khả năng mở rộng dễ dàng cho các dự án crawling phức tạp.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào