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

Bình luận: 0

Web scraping liên quan đến việc trích xuất dữ liệu từ các trang web để phân tích, nghiên cứu hoặc tự động hóa. Trong hướng dẫn cURL Python này, bạn sẽ học cách thực hiện các yêu cầu web bằng PycURL với các ví dụ thực tế. Chúng tôi cũng sẽ chỉ cho bạn cách chuyển đổi một lệnh curl thông thường sang yêu cầu Python và so sánh nó với các thư viện như Requests, HTTPX và AIOHTTP.

Cách sử dụng lệnh cURL trong Python

Hiểu khái niệm này là rất quan trọng đối với việc tích hợp Python, vì vậy hãy bắt đầu với những điều cơ bản. Bạn có thể sử dụng các lệnh Python cURL trực tiếp trong terminal để thực hiện các tác vụ như gửi yêu cầu GET và POST.

Ví dụ về lệnh cURL:


# Yêu cầu GET
curl -X GET "https://httpbin.org/get"

# Yêu cầu POST
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, hãy cài đặt thư viện PycURL của Python.

Cài đặt:


pip install pycurl

Thực hiện yêu cầu HTTP với PycURL

Sử dụng curl trong Python cung cấp khả năng kiểm soát chi tiết các yêu cầu HTTP. Dưới đây là ví dụ minh họa cách thực hiện yêu cầu GET với PycURL:


import pycurl
import certifi
from io import BytesIO

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

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

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

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

# Đặt đường dẫn đến tệp CA bundle để 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 phản hồi từ bộ đệm
body = buffer.getvalue()

# Giải mã và in ra nội dung phản hồi
print(body.decode('iso-8859-1'))

Xử lý yêu cầu POST

Gửi dữ liệu với POST – từ curl sang yêu cầu Python – là điều thường gặp. Với thư viện này, hãy sử dụng tùy chọn POSTFIELDS. Dưới đây là ví dụ về cách thực hiện yêu cầu POST với PycURL:


import pycurl
import certifi
from io import BytesIO

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

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

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

# Đặt dữ liệu cần gửi
post_data = 'param1="pycurl"m2=article'
c.setopt(c.POSTFIELDS, post_data)

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

# Đặt đường dẫn đến tệp CA bundle để 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 hệ thống
c.close()

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

# Giải mã và in ra nội dung phản hồi
print(body.decode('iso-8859-1'))

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

Các yêu cầu HTTP thường yêu cầu token xác thực hoặc tiêu đề tùy chỉnh. Xử lý tiêu đề tùy chỉnh có thể được thực hiện hiệu quả khi bạn biết cách sử dụng kỹ thuật Python curl json parse:


import pycurl
import certifi
from io import BytesIO

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

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

# Thiết lập URL cho yêu cầu HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Thiết lập các header HTTP tùy chỉnh
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Thiết lập bộ đệm để lưu dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Thiết lập đường dẫn tới tệp CA bundle để xác minh SSL/TLS
c.setopt(c.CAINFO, certifi.where())

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

# Sau khi xong, đóng handle cURL để dọn dẹp
c.close()

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

# Giải mã và in ra nội dung phản hồi
print(body.decode('iso-8859-1'))

Xử lý phản hồi XML

Khi làm việc với việc phân tích XML và xử lý các API khác nhau, việc xử lý phản hồi XML là rất cần thiết. Dưới đây là ví dụ về xử lý phản hồi XML với PycURL:


# Import các thư viện cần thiết
import pycurl  # Thư viện để gửi 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ý luồng byte
import xml.etree.ElementTree as ET  # Thư viện để phân tích cú pháp XML

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

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

# Thiết lập URL cho yêu cầu HTTP GET
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Thiết lập bộ đệm để lưu dữ liệu
c.setopt(c.WRITEDATA, buffer)

# Thiết lập đường dẫn tới tệp CA bundle để 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 phản hồi từ bộ đệm
body = buffer.getvalue()

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

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

Xử lý lỗi HTTP

Xử lý lỗi cho các yêu cầu HTTP là một phần quan trọng khi làm việc với tích hợp bên ngoài. Dưới đây là ví dụ về xử lý lỗi với PycURL:


import pycurl  # Import thư viện pycurl
import certifi  # Import thư viện certifi
from io import BytesIO  # Import BytesIO để xử lý luồng byte

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

buffer = BytesIO()
# Thiết lập 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, bắt ngoại lệ pycurl.error
    errno, errstr = e.args  # Lấy mã lỗi và thông báo lỗi
    print(f'Lỗi: {errstr} (errno {errno})')  # In thông báo và mã 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 phản hồi

Mã đã chỉnh sửa đổi URL thành https://example.com để khắc phục sự cố giao thức. Sau đó, tác giả lặp lại các bước cấu hình yêu cầu, thực thi và xử lý lỗi như ở đoạn đầu tiên. Khi thực hiện thành công, nội dung phản hồi được giải mã và in ra, nhấn mạnh tầm quan trọng của việc tạo URL đúng, duy trì luồng yêu cầu hợp lý và triển khai xử lý lỗi mạnh mẽ khi sử dụng PycURL.

3.png


import pycurl  # Import thư viện pycurl
import certifi  # Import thư viện certifi
from io import BytesIO  # Import BytesIO để xử lý luồng byte

# Khởi tạo lại đố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 đã chỉnh sửa
    c.perform()
except pycurl.error as e:
    # Nếu xảy ra lỗi, bắt ngoại lệ pycurl.error
    errno, errstr = e.args  # Lấy mã lỗi và thông báo lỗi
    print(f'Lỗi: {errstr} (errno {errno})')  # In thông báo và mã 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 phản hồi

Các tính năng nâng cao của cURL

Khi làm việc với việc chuyển đổi yêu cầu cURL sang Python, nên biết rằng cURL cung cấp nhiều tùy chọn nâng cao để kiểm soát hành vi HTTP, chẳng hạn như xử lý cookie và thời gian chờ. Dưới đây là ví dụ minh họa các tùy chọn nâng cao khi chạy lệnh curl trong Python.


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

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

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

# Thiết lập URL cho yêu cầu HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Kích hoạt cookie bằng cách thiết lập cặp key-value cụ thể
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Thiết lập thời gian chờ 30 giây cho yêu cầu
c.setopt(c.TIMEOUT, 30)

# Thiết lập bộ đệm để lưu dữ liệu đầu ra
c.setopt(c.WRITEDATA, buffer)

# Thiết lập đường dẫn tới tệp CA bundle để 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 phản hồi từ bộ đệm
body = buffer.getvalue()

# Giải mã phản hồi bằng UTF-8 và in ra
print(body.decode('utf-8'))

So sánh PycURL, Requests, HTTPX và AIOHTTP

Có bốn thư viện phổ biến khi làm việc với yêu cầu HTTP trong Python: PyCurl, Requests, HTTPX và AIOHTTP. Mỗi thư viện đều có ưu và nhược điểm riêng. Dưới đây là bảng so sánh để giúp bạn chọn công cụ phù hợp với nhu cầu của mình:

Tính năng PycURL Requests HTTPX AIOHTTP
Dễ sử dụng Trung bình Rất dễ Dễ Trung bình
Hiệu suất Cao Trung bình Cao Cao
Hỗ trợ bất đồng bộ Không Không
Truyền dữ liệu trực tiếp (Streaming) Giới hạn
Hỗ trợ giao thức Rộng (hỗ trợ nhiều giao thức) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

Người dùng nâng cao sẽ đánh giá cao khả năng điều khiển tùy chỉnh mà các lệnh HTTP mang lại; họ sẽ thấy PycURL vượt mong đợi về hiệu suất. Mặt khác, Requests và HTTPX phù hợp hơn cho các tình huống đơn giản, trực quan. AIOHTTP nổi bật trong việc xử lý tác vụ bất đồng bộ, cung cấp công cụ hiệu quả để quản lý các yêu cầu bất đồng bộ.

Như bạn có thể thấy, lựa chọn của bạn có thể thay đổi tùy vào phạm vi dự án – linh hoạt so với tốc độ. Trong các ngữ cảnh nâng cao, PycURL nổi bật là lựa chọn ưu tiên, thậm chí có thể là duy nhất.

Kết luận

Nếu hiệu suất và khả năng kiểm soát ở mức thấp là ưu tiên của bạn khi thực hiện các yêu cầu HTTP, PycURL là một lựa chọn vững chắc. Việc học cách dùng cURL trong Python có thể không phải con đường thân thiện nhất cho người mới bắt đầu, nhưng nó mở khóa các khả năng mạnh mẽ mà nhiều thư viện trừu tượng hơn thường ẩn đi. Từ web scraping và xử lý XML đến quản lý header tùy chỉnh và cookie, PycURL xử lý tất cả một cách chính xác. Tuy nhiên, cho các tác vụ đơn giản hơn, quy trình bất đồng bộ hoặc yêu cầu dễ sử dụng, các thư viện như Requests, HTTPX và AIOHTTP có thể phù hợp hơn.

Bình luận:

0 Bình luận