🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Niquests Web Scraping: Các yêu cầu HTTP/2 hiện đại cho Python

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

23-Jul-2026

TL;DR:

  • niquests là một sự thay thế trực tiếp cho requests với cùng API cộng với HTTP/2, HTTP/3, và kết nối đa tuyến - chỉ cần thay đổi import và mã của bạn vẫn hoạt động.
  • Điều mà niquests không làm là render JavaScript. Nó là một client HTTP; trên một trang được xây dựng bằng script, nó trả về markup mà máy chủ gửi, trong đó không có nội dung.
  • Khoảng cách xuất hiện trong một script. niquests lấy một trang demo được render bằng JavaScript qua HTTP/2 và tìm thấy 0 khối trích dẫn trong đó.
  • niquests cũng là client gọi Scrapeless. Một lần chạy trực tiếp sử dụng cùng một phiên để POST URL tới Scrapeless Universal Scraping API, nhận lại HTML đã render, và lấy tất cả 10 tác giả từ đó.
  • Một client HTTP cho cả hai nhiệm vụ. Lấy dữ liệu trực tiếp nơi mà nó hoạt động, Scrapeless API nơi cần render - cùng một Session, cùng một API.
  • Miễn phí để bắt đầu trên phía lấy dữ liệu. Tạo khóa API Scrapeless của bạn tại app.scrapeless.com.

Niquests là gì, và nó không phải là gì

niquests là một nhánh của requests mà giữ nguyên API bạn đã biết - Session, get, post, json() - và thêm các tính năng truyền tải mà requests chưa có: HTTP/2 và HTTP/3, kết nối đa tuyến, và DNS qua HTTPS. Đối với một scraper, lợi ích thực tiễn là import niquests as requests nâng cấp một mã nguồn hiện có lên HTTP hiện đại mà không cần viết lại, và việc truyền tải đa tuyến di chuyển nhiều yêu cầu qua ít kết nối hơn.

Điều nó không phải là một trình duyệt. niquests giao tiếp qua HTTP, vì vậy nó trả lại chính xác những gì máy chủ gửi; nó không chạy JavaScript xây dựng nội dung của một trang hiện đại. Một giao thức nhanh hơn, hiện đại hơn không thay đổi điều đó - một trang rỗng được lấy qua HTTP/2 vẫn là rỗng. Vì vậy, một scraper niquests thực hiện hai nhiệm vụ cho một client: lấy các trang cung cấp nội dung trực tiếp, và đối với các trang xây dựng nó bằng script, gọi một API render. Hướng dẫn này sử dụng Scrapeless Universal Scraping API cho công việc thứ hai, với niquests tự thực hiện cuộc gọi đó. Để có bộ công cụ rộng hơn, tutor web scraping Python là bạn đồng hành.

Cài đặt

niquests là toàn bộ chuỗi công cụ - nó không cần một parser riêng cho hướng dẫn này. Phiên bản mà hướng dẫn này được viết dựa trên là niquests 3.20.1:

bash Copy
pip install "niquests==3.20.1"

Giữ khóa của bạn trong môi trường, không bao giờ trong mã nguồn:

bash Copy
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

Lấy dữ liệu trực tiếp, và nơi nó dừng lại

Hướng niquests đến một trang được render bằng JavaScript và hai điều là đúng cùng một lúc: việc truyền tải là hiện đại, và nội dung thì không có. Kết nối thương thuyết HTTP/2 - một giao thức được định nghĩa bởi chuẩn HTTP/2requests không giao tiếp - nhưng markup được trả về có 0 khối trích dẫn, vì nội dung được xây dựng bên phía client theo đặc tả scripting HTML:

python Copy
# direct.py - truyền tải hiện đại, thiếu nội dung
import niquests

session = niquests.Session()
resp = session.get("https://quotes.toscrape.com/js/", timeout=30)

print("phiên bản http:", resp.conn_info.http_version)
print("khối trích dẫn trên trang js:", resp.text.count('class="quote"'))

Việc truyền tải là HTTP/2; nội dung thì không có:

text Copy
phiên bản http: HttpVersion.h2
khối trích dẫn trên trang js: 0

Số 0 đó không phải là lỗi của niquests - đó là kết quả chính xác cho một client HTTP trên một trang mà nội dung đến sau khi các script chạy. Giải pháp là một lớp lấy dữ liệu render.

Lấy dữ liệu đã render, với niquests gọi Scrapeless

Giữ nguyên phiên và thay đổi mục tiêu: thay vì trang, POST URL của nó tới Scrapeless Universal Scraping API, nơi render bên phía máy chủ và trả về HTML đã hoàn thành. niquests xử lý yêu cầu này như bất kỳ yêu cầu nào khác, vì vậy một client bao phủ cả hai con đường - lớp yêu cầu và phản hồi ở đây tuân theo chuẩn ngữ nghĩa HTTP:

python Copy
# rendered.py - niquests gọi API render, sau đó trích xuất
import os
import re

import niquests

session = niquests.Session()
resp = session.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    json={"actor": "unlocker.webunlocker", "input": {"url": "https://quotes.toscrape.com/js/", "js_render": True}},
    timeout=120,
)
resp.raise_for_status()
html = resp.json()["data"]

authors = re.findall(r'<small class="author">(.*?)</small>', html)
print("khối trích dẫn đã render:", html.count('class="quote"'))
print("tác giả được trích xuất:", len(authors))
print("tác giả đầu tiên:", authors[0])

Giờ đây, nội dung đã có và có thể trích xuất:

text Copy
khối trích dẫn đã render: 10
tác giả được trích xuất: 10

tác giả đầu tiên: Albert Einstein

Copy
Đó là toàn bộ scraper, và nó không bao giờ rời khỏi niquests: một `Session` thực hiện yêu cầu trực tiếp nơi mà điều đó hoạt động và một yêu cầu Scrapeless nơi mà việc kết xuất là cần thiết. [Universal Scraping API](https://www.scrapeless.com/vi/product/universal-scraping-api?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) thực hiện việc kết xuất; niquests xử lý HTTP.

> Nhận khóa API của bạn trên gói miễn phí: [app.scrapeless.com](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping)

## Các mẫu nâng cao

- **Di chuyển chỉ với một dòng.** `import niquests as requests` cho phép một mã nguồn `requests` hiện có áp dụng HTTP/2 và multiplexing mà không cần thay đổi khác; API là giống nhau.
- **Tái sử dụng phiên.** Một `niquests.Session()` đơn lẻ tạo nhóm và multiplexing các kết nối, đây là nơi mà lợi thế vận chuyển xuất hiện qua nhiều yêu cầu — xây dựng một lần và truyền nó xung quanh.
- **Thêm một phân tích cú pháp thực sự khi bạn vượt qua regex.** Regex ở đây giữ ví dụ ở một phụ thuộc; đối với bất cứ điều gì ngoài danh sách phẳng, cung cấp `resp.json()["data"]` cho một thư viện chọn lựa và chọn các trường có cấu trúc.
- **Để nó đàm phán.** Niquests chọn HTTP/2 hoặc HTTP/3 khi máy chủ cung cấp và trở lại sạch sẽ khi nó không; bạn không cấu hình phiên bản, bạn đọc nó từ `conn_info` khi bạn muốn xác nhận.

## Khắc phục sự cố

- **`conn_info.http_version` là HTTP/1.1.** Máy chủ không cung cấp HTTP/2 cho yêu cầu đó, hoặc một trung gian đã hạ cấp nó. Điều này là bình thường và không phải là lỗi; niquests sử dụng phiên bản tốt nhất có sẵn.
- **Không có khối nào từ một trang bạn có thể thấy trong trình duyệt.** Nội dung được kết xuất bằng JavaScript và việc lấy trực tiếp trả về HTML đã được kết xuất trước — trường hợp `js-page quote blocks: 0`. Chuyển hướng URL đó qua cuộc gọi Scrapeless với `js_render` thay vào đó.
- **`json()` bị lỗi trên phản hồi Scrapeless.** Yêu cầu đã thất bại trước khi kết xuất. Gọi `raise_for_status()` trước, và xác nhận rằng khóa đã được thiết lập và tác nhân cùng đầu vào được hình thành như đã chỉ ra.
- **Thời gian chờ trên các trang chậm.** Kết xuất mất nhiều thời gian hơn so với việc lấy tĩnh. Đưa vào POST Scrapeless một `timeout` hào phóng, như ví dụ làm, thay vì mặc định ngắn mà bạn sẽ sử dụng cho một yêu cầu trực tiếp.

## Kết luận

Niquests xứng đáng có chỗ đứng như là một HTTP client mà một scraper cần: API `requests` với giao thông hiện đại, xử lý cả yêu cầu lấy trực tiếp và cuộc gọi đến API kết xuất. Lớp biến một trang xây dựng bằng mã thành nội dung là việc lấy — kết quả không có khối của yêu cầu trực tiếp giải quyết điều đó — và một POST Scrapeless, được niquests thực hiện, thu hẹp khoảng cách. Kết nối hai con đường vào một phiên duy nhất và mười tác giả từ trang demo quay trở lại qua HTTP mà bạn không phải viết lại.

[Tạo một tài khoản Scrapeless miễn phí](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) để nhận khóa API, và [tài liệu phát triển](https://docs.scrapeless.com?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) đề cập đến các tham số `unlocker.webunlocker`. Kiểm tra [giá Scrapeless](https://www.scrapeless.com/vi/pricing?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) khi bạn lên kế hoạch cho một công việc định kỳ.

## Câu hỏi thường gặp

**H: Niquests có thể tự động thu thập các trang render bằng JavaScript không?**

Không. Niquests là một HTTP client, không phải trình duyệt; nó trả lại mã mà máy chủ gửi và không chạy bất kỳ kịch bản nào. Trên một trang mà xây dựng nội dung của nó bên phía khách hàng, yêu cầu lấy trực tiếp trở về với nội dung thiếu — kết quả không có khối của hướng dẫn. Chuyển hướng những trang đó qua Universal Scraping API của Scrapeless, cái sẽ kết xuất chúng, và niquests cũng thực hiện cuộc gọi đó.

**H: Niquests khác gì so với requests?**

Cùng API, vận chuyển mới hơn. Niquests là một nhánh của `requests` thêm HTTP/2, HTTP/3, multiplexing kết nối, và DNS-over-HTTPS trong khi giữ `Session`, `get`, `post`, và `json()` giống hệt. `import niquests as requests` thường là toàn bộ di chuyển.

**H: Tôi có cần một phân tích cú pháp riêng không?**

Đối với danh sách các trường phẳng, một regex hoặc thư viện tiêu chuẩn là đủ, như đã chỉ ra. Đối với việc trích xuất lồng hoặc có cấu trúc, kết hợp niquests với một thư viện chọn lựa — niquests lấy, trình phân tích chọn. Hướng dẫn này giữ chỉ một phụ thuộc với mục đích.

**H: HTTP/2 có giúp thu thập các khối không?**

Đó là một nâng cấp vận chuyển, không phải là một biện pháp chống khối. Multiplexing HTTP/2 cải thiện băng thông qua nhiều yêu cầu, nhưng nó không kết xuất JavaScript hoặc giải quyết các thách thức truy cập — đó là công việc của lớp lấy, đó là lý do mà con đường kết xuất đi qua Scrapeless.

**H: Việc thu thập với niquests có hợp pháp không?**
Khách hàng HTTP không thay đổi các quy tắc thu thập. Chỉ lấy các trang công khai, tôn trọng các điều khoản của trang web và các chỉ thị của robot được tiêu chuẩn hóa bởi <a href="https://datatracker.ietf.org/doc/html/rfc9309" rel="nofollow"><strong>Giao thức loại trừ Robot</strong></a>, giữ cho khối lượng dữ liệu có giới hạn và xử lý bất kỳ dữ liệu cá nhân nào theo các luật áp dụng cho bạn.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục