Gzip là gì? Cách hoạt động của HTTP gzip
API Scraping Universal không cần scrap lấy nội dung web công cộng được phép và có thể render JavaScript khi Gzip Compression cần được quan sát trong một phản hồi thực tế.
TL;DR
- Gzip Compression có một vai trò giao thức chính xác. Gzip compression là một định dạng không mất dữ liệu kết hợp dữ liệu nén DEFLATE với một lớp gzip chứa metadata và kiểm tra toàn vẹn.
- Gzip Compression phải được đọc ở lớp đúng. Chuyển giao, đại diện, chính sách trình duyệt và ủy quyền ứng dụng vẫn là các vấn đề riêng biệt.
- Các trung gian có thể thay đổi những gì mà ứng dụng quan sát. Cổng, bộ nhớ đệm, mặc định trình duyệt và thư viện khách có thể thêm xử lý giữa byte nguồn và dữ liệu đã phân tích.
- Xác thực cần bằng chứng nội dung. Một trạng thái hoặc trường đơn lẻ không chứng minh rằng đại diện công cộng mong đợi đã đến.
- Bảo mật phụ thuộc vào phạm vi và xác thực. Cú pháp giao thức không bao giờ cấp quyền truy cập vào tài nguyên hoặc tin tưởng vào giá trị do caller cung cấp.
Gzip là gì?
Gzip compression là một định dạng không mất dữ liệu kết hợp dữ liệu nén DEFLATE với một lớp gzip chứa metadata và kiểm tra toàn vẹn. Trong HTTP, gzip là một mã hóa nội dung: các khách hàng quảng cáo hỗ trợ với Accept-Encoding, các máy chủ xác định một đại diện nén với Content-Encoding: gzip, và người nhận giải mã các byte trước khi diễn giải loại phương tiện ban đầu.
Định nghĩa hữu ích bao gồm cả cơ chế và biên giới của nó. Gzip Compression ảnh hưởng đến một phần cụ thể của một giao dịch, trong khi các trách nhiệm bên cạnh vẫn thuộc về HTTP, trình duyệt, phương tiện truyền tải được chọn, ứng dụng, hoặc mô hình dữ liệu của máy chủ. Giữ cho những lớp đó tách biệt làm cho các báo cáo lỗi có thể tái tạo và ngăn chặn một thay đổi cấu hình bị nhầm lẫn với một quyết định kiểm soát truy cập.
Đối với các nhà phát triển API, câu hỏi đầu tiên là ai tạo ra giá trị hoặc hành vi. Câu hỏi tiếp theo là ai diễn giải nó. Câu hỏi cuối cùng là kết quả nhìn thấy được nào chứng minh rằng việc diễn giải đã hoạt động. Ba câu trả lời đó biến một thuật ngữ từ điển thành một hợp đồng giao diện có thể kiểm tra.
Từ Đại diện Thuần túy đến Byte gzip
Nguồn gốc bắt đầu với một đại diện như HTML, JSON, CSS, hoặc JavaScript. Một máy nén tìm các chuỗi byte lặp lại và mã hóa chúng qua phương pháp DEFLATE, sau đó lớp gzip ghi lại thông tin định dạng và mã kiểm tra. Giải nén tái tạo chính xác các byte gốc.
Một khách hàng gửi Accept-Encoding với các mã hóa mà nó có thể giải mã. Máy chủ hoặc trung gian chọn gzip khi có sẵn và phù hợp, thêm Content-Encoding: gzip, và gửi đại diện đã mã hóa. Content-Type vẫn mô tả loại phương tiện gốc thay vì định dạng nén.
Content-Length, khi có, mô tả chiều dài thông điệp đã mã hóa. Các thư viện và trình duyệt thường tự động giải mã nội dung, có nghĩa là mã ứng dụng có thể nhận văn bản thuần túy mặc dù các công cụ mạng hiển thị phản hồi gzip. Gỡ lỗi byte thô phải tính đến hành vi của khách hàng đó.
Nén là hữu ích nhất cho văn bản lặp lại. Các định dạng đã chứa nén dày, chẳng hạn như nhiều hình ảnh, lưu trữ, và định dạng video, có thể nhận được ít lợi ích hoặc thậm chí trở nên lớn hơn sau một bước mã hóa khác.
Các lớp gzip và HTTP
Các thuật ngữ sau tách biệt các thành phần thường bị gộp lại thành một nhãn. Đọc chúng như là các giao diện giữa các bên tham gia thay vì như là trang trí trong một bản theo dõi mạng.
DEFLATE
Mã hóa không mất dữ liệu dựa trên việc khớp chuỗi lặp lại và mã hóa Huffman.
gzip wrapper
Bao bì định dạng quanh dữ liệu đã nén, bao gồm thông tin tiêu đề và kiểm tra toàn vẹn.
Accept-Encoding
Trường ưu tiên yêu cầu quảng cáo các bộ giải mã có sẵn cho người nhận.
Content-Encoding
Trường đại diện phản hồi đặt tên gzip như một mã hóa đã áp dụng.
Content-Type
Loại phương tiện của đại diện gốc sau khi giải mã.
Vary
Tín hiệu bộ nhớ đệm phân tách các đại diện đã mã hóa và danh tính khi Accept-Encoding ảnh hưởng đến việc chọn lựa.
Tại sao Gzip Compression lại quan trọng trong việc thu thập dữ liệu web
Gzip Compression có thể thay đổi những byte nào đến, cách mà những byte đó được diễn giải, hoặc liệu mã trình duyệt có thể quan sát kết quả hay không. Một quy trình thu thập nên xác định hiệu ứng đó trước khi thay đổi công cụ. Ghi lại URL đã yêu cầu, URL cuối, trạng thái phản hồi, loại đại diện, các trường giao thức liên quan, và một đánh dấu nội dung mong đợi. Hồ sơ gọn gàng đó phân biệt một trang đúng với một thông điệp truy cập, màn hình đồng ý, mục tiêu chuyển hướng, shell ứng dụng rỗng, hoặc mã hóa không tương thích.
HTTP trực tiếp là con đường thu thập đơn giản nhất khi dữ liệu cần thiết tồn tại trong một phản hồi do máy chủ-rendered mở. Một trình duyệt trở nên có liên quan khi nội dung được phê duyệt phụ thuộc vào việc thực thi JavaScript, trạng thái do trình duyệt quản lý, điều hướng, hoặc chính sách bảo mật của trình duyệt. Hai con đường không nên bị ép buộc nhìn giống nhau: trình duyệt quản lý cookie, nén, chuyển hướng, CORS, và lưu trữ theo quy tắc nền tảng, trong khi một khách hàng trực tiếp tiết lộ một tập hợp mặc định khác.
Liên tục phiên là quan trọng bất cứ khi nào một phản hồi thiết lập trạng thái cho yêu cầu tiếp theo. Giữ một chuỗi được ủy quyền trong một ngữ cảnh khách hàng bị giới hạn, duy trì địa phương và nguồn mạng cần thiết, và tránh trộn lẫn trạng thái từ các công việc không liên quan. Một proxy thay đổi nguồn mạng; nó không tái tạo tiêu đề, giải mã các đại diện, thực thi kịch bản, hoặc cấp quyền truy cập vào nội dung bị hạn chế.
Phân tích bắt đầu chỉ sau khi xác thực đại diện. Xác nhận máy chủ cuối cùng, danh tính chính xác nơi có sẵn, loại phương tiện, trạng thái giải mã, và đánh dấu kinh doanh cần thiết trước khi trích xuất các trường. Thứ tự này ngăn chặn một bộ phân tích biến một tài liệu lỗi thành các hồ sơ rỗng có vẻ về mặt kỹ thuật là thành công.
Các trung gian xứng đáng được chú ý rõ ràng. Một mạng phân phối nội dung có thể chọn một biến thể đã mã hóa, một cổng có thể trả lời OPTIONS, một bộ nhớ đệm có thể tái sử dụng một phản hồi đã thương lượng, và một máy chủ ứng dụng có thể thiết lập các cookie hoặc các trường ủy quyền.
API Scraping Toàn cầu Không Rác là liên quan khi một nhóm cần thu hồi quản lý nội dung công cộng được phép, bao gồm các trang được render bằng JavaScript. Hợp đồng mua lại vẫn nên xác định mục tiêu, các trường được phép, đại diện mong đợi, dấu hiệu chấp nhận và các điều kiện dừng.
Nội dung thường hưởng lợi từ gzip
Gzip Compression kiếm được một vị trí trong kiến trúc khi nó thay đổi hành vi sản phẩm cụ thể, yêu cầu tương thích, hoặc quyết định chẩn đoán. Những trường hợp sử dụng này mô tả công việc trước tiên và tính năng giao thức sau.
Tài liệu HTML
Các thẻ, thuộc tính và mẫu văn bản lặp lại thường nén tốt.
Phản hồi JSON
Các tên thuộc tính lặp lại và dấu câu cấu trúc tạo ra sự dư thừa hữu ích.
Tài liệu kiểu dáng
Các bộ chọn và tuyên bố thường lặp lại trong một tệp.
JavaScript
Văn bản nguồn chứa các định danh và cú pháp lặp lại ngay cả sau khi đã làm nhỏ lại.
XML và SVG
Đánh dấu văn bản và tên phần tử lặp lại là các đầu vào nén tốt.
Dữ liệu phân định
CSV và văn bản bảng tương tự thường lặp lại các dấu phân cách và giá trị phân loại.
gzip, deflate, Brotli và Tệp Lưu trữ
Gzip Compression thuộc về một lớp của HTTP và không nên bị nhầm lẫn với các lớp liền kề. Một thực hiện tốt xác định thành phần nào chọn giá trị, thành phần nào có thể thay đổi nó, và bằng chứng nào chứng minh rằng đại diện cuối cùng là đúng.
| Kích thước | Gzip Compression | Khái niệm hoặc thay thế liên quan |
|---|---|---|
| mã hóa HTTP gzip | nén đại diện không mất dữ liệu | Tương thích rộng rãi cho các phản hồi văn bản |
| mã hóa deflate | DEFLATE bọc zlib trong ngữ nghĩa HTTP | Mã hóa nội dung kế thừa với sự nhầm lẫn lịch sử |
| mã hóa Brotli br | Định dạng không mất dữ liệu khác với từ điển tĩnh | Thường được chọn cho văn bản web khi được hỗ trợ |
| tệp ZIP | Bộ chứa có thể chứa nhiều tệp | Tải xuống và các bộ sưu tập tệp đóng gói |
| Danh tính | Không áp dụng mã hóa nội dung | Các đại diện nhỏ hoặc đã nén sẵn |
Một so sánh là hữu ích chỉ khi nó bảo tồn các ranh giới lớp. Hai cơ chế có thể đồng tồn tại trong một yêu cầu, và việc thay thế một không tự động thay thế cái kia. Ghi chép hành vi đã chọn về đầu vào, đầu ra quan sát được, trạng thái thất bại, và quyền sở hữu.
Lỗi Triển khai và Phân Tích gzip
- Nén các phương tiện đã được nén trước. Công việc thêm có thể tạo ra tiết kiệm không đáng kể hoặc một kết quả lớn hơn.
- Quên Content-Encoding. Người nhận không thể biết rằng các byte thô yêu cầu giải mã gzip.
- Thay đổi byte nhưng giữ chiều dài cũ. Content-Length phải mô tả đại diện đã mã hóa thực sự được gửi đi.
- Lưu trữ một biến thể cho mỗi khách hàng. Các khóa Vary và cache nên phân biệt các lựa chọn Accept-Encoding.
- Giải mã hai lần. Nhiều thư viện HTTP tự động giải mã, vì vậy một bước ứng dụng thứ hai thất bại trên các byte đã được giải mã.
- Nhầm lẫn gzip với ZIP. gzip đại diện cho một luồng dữ liệu nén, trong khi ZIP là một bộ chứa lưu trữ có cấu trúc khác nhau.
Hầu hết các lỗi trở nên dễ chẩn đoán hơn sau khi loại bỏ những giả định về những gì mà một thư viện hoặc trình duyệt đã tự động thực hiện. Ghi lại một dấu vết tối thiểu, bỏ qua bí mật, và thay đổi một biến có kiểm soát tại một thời điểm. Mục tiêu là có một giải thích ổn định cho cách trình bày được trả về, chứ không phải là một bộ sưu tập các điều chỉnh tiêu đề không liên quan.
Một cuộc kiểm tra Phản hồi Gzip
Chuỗi này hoạt động như một đánh giá thiết kế trước khi ra mắt và như một chẩn đoán sản xuất sau khi thay đổi hành vi. Nó giữ bằng chứng giao thức liên kết với kết quả ứng dụng.
- Gửi một yêu cầu với một giá trị Accept-Encoding có kiểm soát và ghi lại phản hồi cuối cùng.
- Kiểm tra Content-Encoding trước khi đọc byte thô và Content-Type trước khi phân tích byte đã giải mã.
- Xác định xem khách hàng có tự động giải mã phản hồi và điều chỉnh các trường lộ ra hay không.
- So sánh kích thước chuyển mã hóa với cách trình bày danh tính cho nội dung đại diện.
- Kiểm tra các khóa Vary và CDN cache để các biến thể mã hóa vẫn tương thích với người nhận.
- Bỏ qua các loại đã được nén trừ khi đo lường cho thấy có lợi ích thực sự.
- Xác thực thân đã giải mã với một tiêu đề, sơ đồ, hoặc dấu hiệu nội dung mong đợi thay vì chỉ kích thước.
Kết thúc cuộc đánh giá bằng cách lưu một mẫu đã chấp nhận nhỏ và một mẫu đã bị từ chối với cùng quy tắc bỏ qua. Các thay đổi trong tương lai sau đó có thể được so sánh với danh tính trang đã biết, các trường mong đợi, và nội dung đã giải mã thay vì chỉ bộ nhớ hoặc ảnh chụp màn hình.
Bảo mật và Quan sát cho Nén Gzip
Nén Gzip tham gia vào một lộ trình yêu cầu có thể vượt qua các trình duyệt, cổng, bộ nhớ cache, và máy chủ gốc. Mỗi bước nhảy nên chỉ chấp nhận các giá trị mà nó hiểu, bảo tồn các trường cần phải sống sót, và tránh sao chép thông tin xác thực hoặc dữ liệu cá nhân vào nhật ký. Cú pháp giao thức không phải là ủy quyền.
Các hồ sơ hoạt động nên ghi lại URL yêu cầu, URL cuối cùng, trạng thái, loại đại diện, tên trường liên quan, và một dấu hiệu nội dung giới hạn. Toàn bộ nội dung và giá trị thông tin xác thực hiếm khi cần thiết cho chẩn đoán thường xuyên và có thể tạo ra rủi ro lưu giữ không cần thiết.
Hành vi của trình duyệt và hành vi HTTP trực tiếp là các bề mặt kiểm tra khác nhau. CORS, lưu trữ cookie, giải nén tự động, và xử lý chuyển hướng có thể được thực hiện bởi trình duyệt hoặc thư viện trước khi mã ứng dụng nhìn thấy kết quả. Ghi lại khách hàng và mặc định của nó khi so sánh các bản ghi lại.
Các tiêu chuẩn xác định Nén Gzip
định nghĩa đặc tả định dạng gzip định nghĩa định dạng dữ liệu gzip không mất mát. Nguồn chính này cố định từ vựng và giới hạn được sử dụng trong bài viết này, trong khi hành vi thực thi vẫn cần được quan sát trong khách hàng và triển khai đã chọn.
đặc tả DEFLATE định nghĩa phương pháp nén được sử dụng bên trong gzip. Nguồn chính này cố định từ vựng và giới hạn được sử dụng trong bài viết này, trong khi hành vi thực thi vẫn cần được quan sát trong khách hàng và triển khai đã chọn.
ngữ nghĩa mã hóa nội dung HTTP định nghĩa gzip là một mã hóa nội dung HTTP. Nguồn chính này cố định từ vựng và giới hạn được sử dụng trong bài viết này, trong khi hành vi thực thi vẫn cần được quan sát trong khách hàng và triển khai đã chọn.
Tham chiếu Content-Encoding của MDN cho thấy các trường đàm phán và giải mã. Nguồn chính này cố định từ vựng và giới hạn được sử dụng trong bài viết này, trong khi hành vi thực thi vẫn cần được quan sát trong khách hàng và triển khai đã chọn.
Quy tắc Triển khai Gzip
Đàm phán nén gzip một cách rõ ràng, gán nhãn cách trình bày đã mã hóa một cách chính xác, giữ cho bộ nhớ cache nhận thức về biến thể, và đo lường nội dung thực thay vì nén mọi loại phương tiện theo thói quen.
Đưa quy tắc đó vào một bài kiểm tra chấp nhận. Nêu rõ bên nào gửi tín hiệu, bên nào giải thích nó, những trung gian nào có thể thay đổi lộ trình, và dấu hiệu nội dung nào chứng minh sự thành công. Điều này làm cho Nén Gzip trở thành một phần của một hệ thống có thể quan sát được chứ không chỉ là một nhãn gán sau một thất bại.
Sẵn sàng xác thực một phản hồi web công khai?
Sử dụng Scrapeless Universal Scraping API để lấy nội dung công khai đã được phê duyệt và kiểm tra hợp đồng đại diện được mô tả trong hướng dẫn này.
Đăng ký hôm nay và nhận $5 tín dụng miễn phí — không cần thẻ tín dụng.
Khi có tín dụng 5 đô la của bạn →Câu hỏi thường gặp
Nén gzip có mất mát không?
Có. Một quá trình giải nén gzip hợp lệ tái tạo chính xác các byte đầu vào ban đầu. Định dạng cũng mang một kiểm tra tính toàn vẹn cho dữ liệu chưa nén.
Nén gzip có giống như ZIP không?
Không. gzip là định dạng luồng dữ liệu nén, trong khi ZIP là định dạng lưu trữ có thể đóng gói nhiều tệp và mục siêu dữ liệu.
Làm thế nào một trình duyệt yêu cầu gzip?
Trình duyệt quảng cáo các mã hóa được hỗ trợ trong Accept-Encoding. Một máy chủ chọn gzip sẽ trả về Content-Encoding: gzip, và trình duyệt thường sẽ giải mã phản hồi trước khi lộ ra mã trang.
Có nên nén hình ảnh bằng gzip không?
Thường là không khi định dạng hình ảnh đã sử dụng nén hiệu quả. Đo lường các tệp đại diện vì một bước mã hóa khác có thể thêm chi phí CPU mà không có lợi ích chuyển giao hữu ích.
Tại sao byte thô lại trông không thể đọc?
Một phản hồi được đánh dấu Content-Encoding: gzip chứa các byte nén. Sử dụng một khách hàng HTTP có thể giải mã cách trình bày hoặc một bộ giải mã gzip trước khi áp dụng bộ phân tích cú pháp cho Content-Type gốc.