×

requests giúp gửi HTTP request và lấy dữ liệu từ web trong Python

Khi làm việc với dữ liệu web trong Python, một trong những thư viện phổ biến nhất để gửi yêu cầu HTTP và lấy dữ liệu là thư viện requests. Thư viện này cung cấp một giao diện đơn giản và dễ sử dụng để gửi các yêu cầu HTTP như GET, POST, PUT, DELETE và nhiều loại khác. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng thư viện requests để gửi các yêu cầu HTTP và lấy dữ liệu từ một trang web.

Giới thiệu về thư viện requests

Thư viện requests đã trở thành một tiêu chuẩn trong cộng đồng Python, chủ yếu nhờ vào tính thuận tiện và khả năng xử lý các yêu cầu HTTP một cách dễ dàng. Dù bạn là người mới học lập trình hay là một nhà phát triển dày dạn kinh nghiệm, requests đều mang đến sự đơn giản và linh hoạt trong việc tạo các yêu cầu nhắm vào API hoặc lấy dữ liệu từ các trang web.

Thư viện requests hỗ trợ nhiều tính năng như:

  • Gửi yêu cầu với các phương thức khác nhau (GET, POST, PUT, DELETE).
  • Dễ dàng thêm tiêu đề (headers) hoặc dữ liệu cần gửi trong yêu cầu.
  • Xử lý các cookie và phiên (session).
  • Tích hợp dễ dàng với JSON và các định dạng khác.
  • Quản lý và xử lý lỗi (exceptions) hiệu quả.

Để bắt đầu sử dụng thư viện requests, bạn cần cài đặt nó nếu chưa có. Bạn có thể cài đặt thư viện này thông qua pip:

pip install requests

Cách gửi yêu cầu GET

Yêu cầu GET là phương thức phổ biến nhất để lấy dữ liệu từ một trang web. Dưới đây là một ví dụ đơn giản:

import requests

# URL mà chúng ta muốn truy cập
url = 'https://api.example.com/data'

# Gửi yêu cầu GET
response = requests.get(url)

# Kiểm tra mã trạng thái
if response.status_code == 200:
    data = response.json()  # Chuyển đổi dữ liệu sang định dạng JSON
    print(data)
else:
    print(f'Lỗi: {response.status_code}')

Trong đoạn mã trên, chúng ta đã sử dụng phương thức get() để gửi một yêu cầu GET đến URL chỉ định. Sau đó, chúng ta kiểm tra mã trạng thái của phản hồi để xác định xem yêu cầu có thành công hay không.

Gửi yêu cầu POST

Ngoài yêu cầu GET, yêu cầu POST thường được sử dụng để gửi dữ liệu đến máy chủ. Dưới đây là cách gửi yêu cầu POST với requests:

import requests

# URL để gửi yêu cầu POST
url = 'https://api.example.com/data'

# Dữ liệu cần gửi
payload = {
    'name': 'John Doe',
    'age': 30
}

# Gửi yêu cầu POST
response = requests.post(url, json=payload)

# Kiểm tra mã trạng thái
if response.status_code == 201:
    print('Dữ liệu đã được gửi thành công!', response.json())
else:
    print(f'Lỗi: {response.status_code}')

Ở đây, chúng ta sử dụng phương thức post() để gửi dữ liệu JSON đến URL. Đoạn mã trên cũng kiểm tra mã trạng thái để xác định xem yêu cầu đã thành công hay chưa.

Thêm Headers vào yêu cầu

Đôi khi bạn cần thêm các tiêu đề (headers) vào yêu cầu của mình, chẳng hạn như thẻ xác thực hoặc thông tin về định dạng dữ liệu. Dưới đây là cách thực hiện điều đó:

import requests

url = 'https://api.example.com/data'

# Headers cần thiết
headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f'Lỗi: {response.status_code}')

Ở ví dụ trên, chúng ta đã thêm tiêu đề Authorization để xác thực và Content-Type để cho máy chủ biết chúng ta đang gửi dữ liệu JSON.

Xử lý lỗi và ngoại lệ

Khi làm việc với yêu cầu HTTP, việc xử lý lỗi là rất quan trọng. Thư viện requests cung cấp một cơ chế để quản lý các ngoại lệ. Bạn có thể dùng khối tryexcept để xử lý các lỗi có thể xảy ra:

import requests

url = 'https://api.example.com/data'

try:
    response = requests.get(url)
    response.raise_for_status()  # Ném ra ngoại lệ nếu mã trạng thái không phải 2xx
    data = response.json()
    print(data)
except requests.exceptions.HTTPError as errh:
    print(f'HTTP Error: {errh}')
except requests.exceptions.ConnectionError as errc:
    print(f'Connection Error: {errc}')
except requests.exceptions.Timeout as errt:
    print(f'Timeout Error: {errt}')
except requests.exceptions.RequestException as err:
    print(f'Request Error: {err}')

Bằng cách này, bạn có thể kiểm soát tốt hơn các tình huống bất thường có thể xảy ra trong quá trình gửi và nhận dữ liệu.

Sử dụng Sessions

Nếu bạn cần gửi nhiều yêu cầu mà giữ lại các thông tin như cookie hoặc tiêu đề giữa các yêu cầu, bạn có thể sử dụng đối tượng Session của requests. Dưới đây là một ví dụ về cách sử dụng Session:

import requests

# Tạo một phiên làm việc
session = requests.Session()

# Thiết lập tiêu đề chung cho các yêu cầu
session.headers.update({
    'Authorization': 'Bearer YOUR_API_TOKEN'
})

# Gửi yêu cầu đầu tiên
response1 = session.get('https://api.example.com/data1')

# Gửi yêu cầu thứ hai
response2 = session.get('https://api.example.com/data2')

# Xử lý dữ liệu
if response1.status_code == 200:
    print('Dữ liệu từ yêu cầu 1:', response1.json())

if response2.status_code == 200:
    print('Dữ liệu từ yêu cầu 2:', response2.json())

Sử dụng Session giúp bạn tiết kiệm thời gian và công sức khi làm việc với nhiều yêu cầu.

Lấy dữ liệu từ HTML

Ngoài việc tương tác với API qua JSON, bạn cũng có thể sử dụng requests để lấy dữ liệu từ các trang HTML. Để làm điều này, bạn có thể kết hợp thư viện BeautifulSoup để phân tích cú pháp và rút trích dữ liệu từ HTML:

import requests
from bs4 import BeautifulSoup

url = 'https://example.com'

response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.content, 'html.parser')
    titles = soup.find_all('h1')  # Lấy tất cả các thẻ h1
    for title in titles:
        print(title.get_text())
else:
    print(f'Lỗi: {response.status_code}')

Ở đây, chúng ta đã sử dụng BeautifulSoup để phân tích cú pháp HTML và lấy ra tất cả các thẻ h1.

Kết luận

Thư viện requests là một công cụ mạnh mẽ và dễ sử dụng cho việc gửi yêu cầu HTML và lấy dữ liệu từ web trong Python. Nó hỗ trợ nhiều phương thức yêu cầu khác nhau, cho phép thêm tiêu đề và xử lý lỗi hiệu quả. Bạn cũng có thể dễ dàng tương tác với các API và phân tích các trang web để lấy dữ liệu cần thiết. Với những hướng dẫn chi tiết trên, bạn có thể bắt đầu sử dụng requests để thực hiện các tác vụ HTTP trong các dự án của mình.

Comments