Hướng dẫn sử dụng Curl với Python

Bình luận: 0

Củ web liên quan đến việc trích xuất dữ liệu từ các trang web cho các tác vụ như phân tích dữ liệu, nghiên cứu và tự động hóa. Mặc dù Python cung cấp các thư viện để gửi các yêu cầu HTTPS và thực hiện cạo, sử dụng Curl thông qua PyCurl có thể hiệu quả hơn. Trong hướng dẫn này, chúng tôi sẽ trình bày cách sử dụng Python Curl để cạo các trang web. Chúng tôi sẽ cung cấp các ví dụ và so sánh hiệu suất của nó với các thư viện phổ biến khác như Yêu cầu, HTTPX và AIOHTTP.

Bắt đầu với Curl và Python

Trước khi lặn vào tích hợp Python, điều cần thiết là phải hiểu những điều cơ bản của Curl. Bạn có thể sử dụng các lệnh Curl trực tiếp trong thiết bị đầu cuối để thực hiện các tác vụ như thực hiện các yêu cầu GET và đăng.

Ví dụ Các lệnh Curl:

# GET lời yêu cầu
curl -X GET "https://httpbin.org/get"

# POST lời yêu cầu
curl -X POST "https://httpbin.org/post"

1.png

2.png

Cài đặt các thư viện cần thiết

Để sử dụng Curl trong Python, chúng tôi cần thư viện PyCurl, cung cấp giao diện Python cho thư viện Curl.

Cài đặt pycurl:

pip install pycurl

Thực hiện các yêu cầu http với pycurl

Pycurl cung cấp kiểm soát chi tiết các yêu cầu HTTP trong Python. Dưới đây là một ví dụ chứng minh cách thực hiện yêu cầu nhận với pycurl:

import pycurl
import certifi
from io import BytesIO

# Tạo đối tượng byte để giữ dữ liệu phản hồi
buffer = BytesIO()

# Khởi tạo một đối tượng Curl
c = pycurl.Curl()

# Đặt URL cho HTTP GET yêu cầu
c.setopt(c.URL, 'https://httpbin.org/get')

# Đặt bộ đệm để ghi dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Đặt đường dẫn đến tệp gói CA để xác minh SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Thực hiện yêu cầu HTTP
c.perform()

# Đóng đối tượng Curl để giải phóng tài nguyên
c.close()

# Lấy nội dung của phản hồi từ bộ đệm
body = buffer.getvalue()

# Giải mã và in cơ thể phản hồi
print(body.decode('iso-8859-1'))

Xử lý các yêu cầu bài

Gửi dữ liệu với yêu cầu POST là phổ biến. Với pycurl, sử dụng tùy chọn Postfields. Dưới đây là một ví dụ về việc đưa ra yêu cầu bài viết với pycurl:

import pycurl
import certifi
from io import BytesIO

# Tạo đối tượng byte để giữ dữ liệu phản hồi
buffer = BytesIO()

# Khởi tạo một đối tượng Curl
c = pycurl.Curl()

# Đặt URL cho yêu cầu bài HTTP
c.setopt(c.URL, 'https://httpbin.org/post')

# Đặt dữ liệu sẽ được đăng
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Đặt bộ đệm để ghi dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Đặt đường dẫn đến tệp gói CA để xác minh SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Thực hiện yêu cầu HTTP
c.perform()

# Đóng đối tượng Curl để giải phóng tài nguyên
c.close()

# Lấy nội dung của phản hồi từ bộ đệm
body = buffer.getvalue()

# Giải mã và in cơ thể phản hồi
print(body.decode('iso-8859-1'))

Xử lý các tiêu đề HTTP tùy chỉnh

Tiêu đề tùy chỉnh hoặc xác thực thường được yêu cầu với các yêu cầu HTTP. Dưới đây là một ví dụ về việc thiết lập các tiêu đề tùy chỉnh với pycurl:

import pycurl
import certifi
from io import BytesIO

# Tạo đối tượng byte để giữ dữ liệu phản hồi
buffer = BytesIO()

# Khởi tạo một đối tượng Curl
c = pycurl.Curl()

# Đặt URL cho HTTP GET yêu cầu
c.setopt(c.URL, 'https://httpbin.org/get')

# Đặt tiêu đề HTTP tùy chỉnh
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Đặt bộ đệm để ghi dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Đặt đường dẫn đến tệp gói CA để xác minh SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Thực hiện yêu cầu HTTP
c.perform()

# Đóng đối tượng Curl để giải phóng tài nguyên
c.close()

# Lấy nội dung của phản hồi từ bộ đệm
body = buffer.getvalue()

# Giải mã và in cơ thể phản hồi
print(body.decode('iso-8859-1'))

Xử lý các phản hồi XML

Phân tích và xử lý các phản hồi XML là rất quan trọng khi làm việc với API. Dưới đây là một ví dụ về việc xử lý các phản hồi XML với pycurl:

# Nhập thư viện cần thiết
import pycurl  # Thư viện để thực hiện các yêu cầu HTTP
import certifi  # Thư viện xác minh chứng chỉ SSL
from io import BytesIO  # Thư viện để xử lý các luồng byte
import xml.etree.ElementTree as ET  # Thư viện phân tích cú pháp XML

# Tạo bộ đệm để giữ dữ liệu phản hồi
buffer = BytesIO()

# Khởi tạo một đối tượng Curl
c = pycurl.Curl()

# Đặt URL cho HTTP GET yêu cầu
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Đặt bộ đệm để ghi dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Đặt đường dẫn đến tệp gói CA để xác minh SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Thực hiện yêu cầu HTTP
c.perform()

# Đóng đối tượng Curl để giải phóng tài nguyên
c.close()

# Lấy nội dung của phản hồi từ bộ đệm
body = buffer.getvalue()

# Phân tích nội dung XML vào đối tượng ElementTree
root = ET.fromstring(body.decode('utf-8'))

# In thẻ và các thuộc tính của phần tử gốc của cây XML
print(root.tag, root.attrib)

Xử lý các lỗi HTTP

Xử lý lỗi mạnh mẽ là điều cần thiết để thực hiện các yêu cầu HTTP đáng tin cậy. Dưới đây là một ví dụ về xử lý lỗi với pycurl:

import pycurl  # Nhập thư viện pycurl
import certifi  # Nhập thư viện Certifi
from io import BytesIO  # Nhập bytesio để xử lý các luồng byte

# Khởi tạo một đối tượng Curl
c = pycurl.Curl()

buffer = BytesIO()
# Đặt URL cho yêu cầu HTTP
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Thực hiện yêu cầu HTTP
    c.perform()
except pycurl.error as e:
    # Nếu xảy ra lỗi trong quá trình yêu cầu, hãy xem ngoại lệ pycurl.error
    errno, errstr = e.args  # Lấy số lỗi và thông báo lỗi
    print(f'Error: {errstr} (errno {errno})')  #In thông báo lỗi và số lỗi
finally:
    # Đóng đối tượng Curl để giải phóng tài nguyên
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Giải mã và in cơ thể phản hồi

3.png

Mã đã sửa điều chỉnh URL thành https://example.com, giải quyết vấn đề giao thức. Nó lặp lại quá trình định cấu hình yêu cầu, thực hiện và xử lý các lỗi như trong đoạn trích ban đầu. Sau khi thực hiện thành công, cơ thể phản hồi lại được giải mã và in. Các đoạn trích này nêu bật tầm quan trọng của cấu hình URL thích hợp và xử lý lỗi mạnh mẽ trong các yêu cầu HTTP với pycurl.

import pycurl  # Nhập thư viện pycurl
import certifi  # Nhập thư viện Certifi
from io import BytesIO  # Nhập bytesio để xử lý các luồng byte

# Tái tạo đối tượng Curl
c = pycurl.Curl()

buffer = BytesIO()
# Sửa URL để sử dụng HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Thực hiện yêu cầu HTTP đã sửa
    c.perform()
except pycurl.error as e:
    # Nếu xảy ra lỗi trong quá trình yêu cầu, hãy xem ngoại lệ pycurl.error
    errno, errstr = e.args  # Lấy số lỗi và thông báo lỗi
    print(f'Error: {errstr} (errno {errno})')  # In thông báo lỗi và số lỗi
finally:
    # Đóng đối tượng Curl để giải phóng tài nguyên
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Giải mã và in cơ thể phản hồi

Các tính năng Curl nâng cao

Curl cung cấp nhiều tùy chọn nâng cao để kiểm soát hành vi yêu cầu HTTP, chẳng hạn như xử lý cookie và thời gian chờ. Dưới đây là một ví dụ chứng minh các tùy chọn nâng cao với pycurl.

import pycurl  # Nhập thư viện pycurl
import certifi  # Nhập thư viện Certifi để xác minh chứng chỉ SSL
from io import BytesIO  # Nhập bytesio để xử lý các luồng byte

# Tạo bộ đệm để giữ dữ liệu phản hồi
buffer = BytesIO()

# Khởi tạo một đối tượng Curl
c = pycurl.Curl()

# Đặt URL cho yêu cầu HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Bật cookie bằng cách đặt một cặp giá trị khóa cụ thể
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Đặt thời gian chờ 30 giây cho yêu cầu
c.setopt(c.TIMEOUT, 30)

#Đặt bộ đệm để ghi dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Đặt đường dẫn đến tệp gói CA để xác minh SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Thực hiện yêu cầu HTTP
c.perform()

# Đóng đối tượng Curl để giải phóng tài nguyên
c.close()

# Lấy nội dung của phản hồi từ bộ đệm
body = buffer.getvalue()

# Decode the response body using UTF-8 encoding and print it
print(body.decode('utf-8'))

So sánh PyCurl, Yêu cầu, HTTPX và AIOHTTP

Khi làm việc với các yêu cầu HTTP trong Python, bốn thư viện phổ biến là pycurl, yêu cầu, httpx và aiohttp. Mỗi người có điểm mạnh và điểm yếu của nó. Đây là một so sánh để giúp bạn chọn công cụ phù hợp cho nhu cầu của mình:

Tính năng PycURL Requests HTTPX AIOHTTP
Dễ sử dụng Vừa phải Rất dễ dàng Dễ Vừa phải
Hiệu suất Cao Vừa phải Cao Cao
Hỗ trợ không đồng bộ KHÔNG KHÔNG Đúng Đúng
Phát trực tuyến Đúng Giới hạn Đúng Đúng
Hỗ trợ giao thức Mở rộng (hỗ trợ nhiều giao thức) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

Phân tích so sánh chỉ ra rằng PyCurl cung cấp hiệu suất và tính linh hoạt cao, làm cho nó phù hợp cho người dùng nâng cao, những người yêu cầu quản lý chi tiết các yêu cầu HTTP. Mặt khác, các yêu cầu và httpx phù hợp hơn cho các kịch bản đơn giản hơn, trực quan hơn. AIOHTTP nổi bật trong việc xử lý các nhiệm vụ không đồng bộ, cung cấp các công cụ hiệu quả để quản lý các yêu cầu không đồng bộ.

Việc lựa chọn thư viện phù hợp phụ thuộc vào các nhu cầu và yêu cầu cụ thể của dự án của bạn, với PYCURL là một lựa chọn tuyệt vời cho những người cần tốc độ và khả năng nâng cao.

Bình luận:

0 Bình luận