Thư viện requests của Python là gì? Hướng dẫn HTTP thực tiễn

Thư viện requests của Python là gì?

API Scraping Không Mảnh vụn Universal có thể được gọi từ thư viện requests của Python khi một quy trình làm việc cần quản lý việc thu thập hoặc đầu ra trang đã được hiển thị.

TL;DR

  • requests là một khách hàng HTTP bên thứ ba cho Python. Nó gửi các phương thức HTTP, mã hóa các tham số và thân, xử lý cookies và phiên, và hiển thị trạng thái phản hồi, tiêu đề, văn bản, byte và JSON.
  • requests không phải là một trình phân tích HTML hoặc trình duyệt. Nó thu hồi các phản hồi của máy chủ nhưng không truy vấn DOM hoặc thực thi JavaScript phía máy khách.
  • Thời gian chờ nên được chỉ định rõ ràng trong mỗi lần gọi. Một công nhân sản xuất cần một kết nối đã biết và ranh giới đọc thay vì phải chờ không giới hạn.
  • Các phiên bảo tồn cookies và tái sử dụng kết nối. Một phiên là hữu ích cho một chuỗi yêu cầu liên quan và không nên được chia sẻ giữa các danh tính hoặc nhiệm vụ không liên quan.
  • Xác thực phản hồi cần hơn raise_for_status. Trang sai có thể đến với trạng thái thành công, vì vậy hãy kiểm tra URL cuối, loại nội dung và các dấu hiệu danh tính.

requests là khách hàng HTTP cấp cao của Python

Thư viện requests của Python cung cấp một giao diện ngắn gọn để gửi yêu cầu HTTP và đọc phản hồi. Nó hỗ trợ các phương thức thông thường, tham số truy vấn, thân dạng và JSON, tiêu đề, cookies, xác thực, proxy, phát trực tuyến, xác minh TLS, chuyển hướng, và các phiên. Nó được cài đặt riêng biệt với thư viện chuẩn của Python.

Các tài liệu chính thức của Requests mô tả thư viện như một giao diện HTTP và liệt kê các tính năng như nhóm kết nối, bảo trì cookie, giải mã tự động, hỗ trợ proxy, tải xuống phát trực tuyến, và thời gian chờ. Những tính năng đó giải quyết các mối quan tâm về vận chuyển; chúng không phân tích HTML đặc thù cho ứng dụng.

Một mô hình tâm lý hữu ích là yêu cầu vào, phản hồi ra. Bạn xây dựng URL mục tiêu, phương thức, tiêu đề và thân. requests gửi chúng và trả về một. ResponseMã ứng dụng sau đó quyết định xem phản hồi có chấp nhận được không và có nên phân tích văn bản, byte, hoặc JSON.

Một đối tượng phản hồi chứa gì

Một phản hồi phơi bày status_code, tiêu đề, cuối cùng url, lịch sử chuyển hướng, đã giải mã text, thô content byte, và một json() trợ lý. Các Hướng dẫn nhanh của Requests cũng khuyến nghị raise_for_status() khi trạng thái HTTP không thành công nên trở thành một ngoại lệ.

Thuộc tính phản hồiÝ nghĩaCảnh báo phổ biến
status_codeTrạng thái phản hồi HTTPThành công không chứng minh danh tính trang
headersSiêu dữ liệu phản hồiLoại nội dung đã khai báo vẫn có thể sai
textVăn bản phản hồi đã giải mãLựa chọn mã hóa ảnh hưởng đến các ký tự
contentByte phản hồi thôCác thân lớn yêu cầu phát trực tuyến hoặc giới hạn
json()Giải mã một thân JSONJSON hợp lệ có thể đi kèm với trạng thái lỗi
urlURL phản hồi cuối cùngCác chuyển hướng có thể dẫn đến một trang không mong muốn

Gọi json() chỉ chứng minh rằng thân có thể được giải mã dưới dạng JSON. Nó không làm cho phản hồi không thành công thành công. Kiểm tra trạng thái và sơ đồ phản hồi mong đợi trước khi chấp nhận các giá trị.

Gửi một yêu cầu có giới hạn

Khu vực làm việc hiện tại chứa các yêu cầu, vì vậy mẫu này có thể được nhập và thực thi. Ví dụ cho thấy thời gian chờ rõ ràng, kiểm tra trạng thái, kiểm tra loại nội dung, và một dấu hiệu nhận diện trang trước khi bất kỳ trình phân tích nào nhận được nội dung.

import requests

with requests.Session() as session:
    session.headers.update({
        "Accept": "text/html,application/xhtml+xml",
        "User-Agent": "ExampleResearchClient/1.0",
    })

    response = session.get(
        "https://example.com/",
        timeout=(10, 20),
        allow_redirects=True,
    )
    response.raise_for_status()

    content_type = response.headers.get("content-type", "")
    if "text/html" not in content_type.lower():
        raise ValueError("expected an HTML response")

    if "Example Domain" not in response.text:
        raise ValueError("expected page identity is missing")

    print({
        "final_url": response.url,
        "status": response.status_code,
        "characters": len(response.text),
    })

Bộ giá trị thời gian chờ tách biệt thời gian kết nối với thời gian tối đa giữa các byte nhận được. Gán cho mỗi cuộc gọi một giá trị rõ ràng gắn liền với khối lượng công việc. Một bộ lập lịch không thể quản lý dung lượng khi một yêu cầu có thể chờ đợi vô thời hạn.

Sử dụng Phiên cho các Yêu cầu Liên quan

A Session duy trì cookie và cấu hình mặc định giữa các yêu cầu và sử dụng kết nối pooling thông qua các bộ điều hợp của nó. Nó là một lựa chọn tốt cho một chuỗi chia sẻ một trạng thái, ngôn ngữ và máy chủ được phép. Nó nên được đóng lại khi nhiệm vụ logic đó kết thúc.

Không chia sẻ một phiên đã xác thực hoặc cá nhân hóa giữa các công việc không liên quan. Cookies ảnh hưởng đến những gì máy chủ trả về và có thể di chuyển bộ sưu tập ra ngoài phạm vi công cộng dự kiến. Giữ bí mật trong môi trường hoặc lưu trữ thông tin đăng nhập, không trong mã nguồn, URL, nhật ký hoặc bản ghi tuần tự.

Các mặc định của phiên có thể bao gồm tiêu đề, xác thực, proxy và tham số truy vấn. Các giá trị theo yêu cầu ghi đè chúng ở nơi có tài liệu. Giữ cho bộ mặc định nhỏ để hành vi của một yêu cầu vẫn rõ ràng trong quá trình xem xét.

Hiểu Ranh Giới Với Phân Tích

requests không cung cấp bộ chọn CSS hoặc XPath. Kết hợp nó với BeautifulSoup, lxml, parsel, hoặc một trình phân tích cú pháp khác khi phản hồi là HTML. Đối với JSON, xác thực đối tượng trả về trực tiếp với các khóa và kiểu dữ liệu mong đợi.

requests cũng không thực thi các script trên trang. Một trình duyệt có thể hiển thị nội dung mà không có trong response.textSo sánh phản hồi thô với DOM trực tiếp, kiểm tra các nguồn mạng được phép và sử dụng thu thập được hiển thị khi dữ liệu cần thiết chỉ tồn tại sau khi JavaScript chạy.

  • Kiểm tra trạng thái trước khi giải mã dữ liệu ứng dụng. Bodies lỗi có thể là HTML hoặc JSON hợp lệ.
  • Xác minh URL cuối cùng. Một chuyển hướng tự động có thể đến trang tài khoản chung hoặc trang đồng ý.
  • Xin vui lòng cung cấp văn bản để tôi có thể dịch. Một tiêu đề hoặc khóa lược đồ đã biết xác nhận lớp phản hồi.
  • Xin vui lòng cung cấp văn bản bạn muốn dịch. Phát trực tuyến các tải xuống lớn và dừng lại khi nội dung vượt quá hợp đồng trang được chấp nhận.

Cấu hình Proxy mà không làm lộ thông tin đăng nhập

requests chấp nhận các URL proxy thông qua proxies biện luận và có thể đọc cấu hình môi trường chuẩn. Đối xử với thông tin xác thực proxy như khóa API: giữ chúng bên ngoài mã nguồn, ngăn chặn chúng xuất hiện trong văn bản ngoại lệ, và không lưu trữ các URL có thông tin xác thực đầy đủ trong đầu ra.

Việc sử dụng proxy nên phù hợp với mục đích địa lý và truy cập được phép. Một vị trí thoát khác có thể thay đổi ngôn ngữ, giá cả, hàng tồn kho, yêu cầu đồng ý và nghĩa vụ pháp lý. Ghi lại khu vực dự định như siêu dữ liệu lô để các so sánh phía dưới không bị trộn lẫn các trang không giống nhau.

Chọn Mã hóa Thân Thể theo Hợp Đồng Máy Chủ

Sử dụng params cho các giá trị chuỗi truy vấn, data đối với nội dung biểu mẫu hoặc nội dung thô, json cho một tài liệu JSON, và files đối với các tải lên đa phần. Những tham số này không thể thay thế cho nhau ngay cả khi Python chấp nhận cùng một từ điển. Máy chủ diễn giải nội dung thông qua loại nội dung và hợp đồng điểm cuối của nó.

Xác thực thuộc về một đối tượng xác thực được hỗ trợ, cấu hình phiên hoặc tiêu đề rõ ràng được định nghĩa bởi dịch vụ. Giữ thông tin đăng nhập ra khỏi chuỗi truy vấn vì URL xuất hiện trong lịch sử, nhật ký truy cập, phân tích và thông điệp lỗi. Xóa tiêu đề ủy quyền trước khi ghi lại một yêu cầu đã chuẩn bị.

Đối với một API thu thập dữ liệu, hãy xác thực cả hai lớp của sự thành công: phản hồi HTTP và bao bọc hoặc lược đồ API. Một trạng thái HTTP thành công có thể mang theo một lỗi ở cấp độ ứng dụng, trong khi một bộ giải mã JSON có thể phân tích cả hai. Các trường bắt buộc và loại giá trị mong đợi nên được kiểm tra trước khi kết quả đến một bộ phân tích HTML.

Luồng các thể thân lớn và đóng tài nguyên

I'm sorry, but you haven't provided any text to translate. Please share the text you want to be translated. stream=True, kiểm tra tiêu đề và lặp lại qua các đoạn giới hạn. Phản hồi nên được đóng một cách rõ ràng hoặc sử dụng trong một trình quản lý ngữ cảnh. Mở rộng điều khiển bộ nhớ cục bộ, nhưng ứng dụng vẫn cần một kích thước nội dung tối đa đã được chấp nhận và kiểm tra loại nội dung.

Các bộ phân tích cú pháp HTML thường xây dựng một cây hoàn chỉnh, vì vậy việc phát trực tuyến tải xuống không tự động làm cho việc phân tích cú pháp sử dụng bộ nhớ không đổi. Chọn một bộ phân tích cú pháp phát trực tuyến hoặc định dạng phân tách chỉ khi nguồn hỗ trợ nó. Giữ giới hạn thu thập phù hợp với bộ phân tích cú pháp và loại tài liệu dự kiến.

Xác thực hợp đồng HTTP và Dữ liệu

The Thông số kỹ thuật ngữ nghĩa HTTP định nghĩa các phương thức, mã trạng thái và hành vi phản hồi. Sự chính xác của ứng dụng nằm trên lớp đó. Một phản hồi thành công vẫn phải khớp với máy chủ mong muốn, đường dẫn cuối cùng, loại nội dung, danh tính trang và sơ đồ dữ liệu.

Đối với các quy trình công khai trên web, hãy xác định phạm vi được ủy quyền trước khi gửi yêu cầu. Xem xét các điều khoản và luật áp dụng, tôn trọng các quyền truy cập, và sử dụng Giao thức loại trừ robot như một đầu vào có thể đọc được bởi máy cho chính sách thu thập dữ liệu.

Kết luận

Thư viện requests của Python là lớp vận chuyển cho nhiều luồng dữ liệu. Nó làm cho HTTP ngắn gọn, cung cấp các phiên và tái sử dụng kết nối, phơi bày siêu dữ liệu phản hồi và hỗ trợ streaming và proxy. Nó không phân tích HTML hoặc chạy JavaScript. Sử dụng đáng tin cậy thêm thời gian chờ rõ ràng, kiểm tra URL cuối cùng và danh tính, cơ thể có giới hạn, phạm vi phiên cẩn thận, và một bộ phân tích hoặc lớp thu mua được kết xuất riêng biệt khi cần.

Sẵn sàng sử dụng yêu cầu với việc thu thập web được quản lý?

Gọi Scrapeless từ một khách hàng HTTP Python quen thuộc, xác thực nội dung đã trả về, và truyền nó cho bộ phân tích và sơ đồ mà ứng dụng của bạn đã sử dụng.

Đăng ký hôm nay và nhận $5 tín dụng miễn phíkhông yêu cầu thẻ tín dụng.

Nhận $5 Tín dụng của bạn →

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

requests có phải là một phần của thư viện chuẩn Python không?

Không. requests là một gói bên thứ ba được cài đặt riêng. Thư viện chuẩn của Python bao gồm các mô-đun HTTP và URL cấp thấp hơn, trong khi requests cung cấp một giao diện cấp cao hơn.

Sự khác biệt giữa requests và BeautifulSoup là gì?

requests nhận được phản hồi HTTP, trong khi BeautifulSoup phân tích HTML hoặc XML. Một quy trình làm việc trang tĩnh thông thường sử dụng requests trước và BeautifulSoup sau.

requests của Python có thể thực thi JavaScript không?

Không. requests lấy phản hồi từ máy chủ và không chạy trình duyệt. Sử dụng phương pháp thu thập nội dung khi các kịch bản tạo nội dung trang cần thiết.

Tại sao mỗi cuộc gọi requests nên đặt thời gian chờ?

Một thời gian chờ rõ ràng cho một worker một ranh giới mạng đã biết và bảo vệ dung lượng hàng đợi. Nếu không có, một yêu cầu có thể chờ lâu hơn nhiều so với thời gian ứng dụng mong đợi.

Khi nào nên sử dụng một phiên requests?

Sử dụng một phiên cho các yêu cầu liên quan chia sẻ cookie, tiêu đề, xác thực hoặc một bể kết nối. Giữ nó theo một danh tính logic và đóng nó lại sau đó.

Tài liệu tham khảo