Bỏ để qua phần nội dung

Quét web bằng các yêu cầu Python

Chào mừng bạn! Tôi rất vui mừng được đưa bạn vào cuộc hành trình vào thế giới quét web với Yêu cầu Python ngay hôm nay. Là một chuyên gia thu thập dữ liệu web có kinh nghiệm, tôi đã sử dụng Yêu cầu Python để xây dựng tất cả các loại công cụ thu thập dữ liệu trong hơn 5 năm. Trong hướng dẫn toàn diện này, tôi sẽ chia sẻ kiến ​​thức nội bộ của mình để giúp bạn thành thạo việc quét web bằng thư viện mạnh mẽ này. Hãy đi sâu vào!

Tại sao nên sử dụng các yêu cầu Python để quét?

Python đã trở nên vô cùng phổ biến trong việc quét web do tính đơn giản và hệ sinh thái rộng lớn của các thư viện quét web. Tôi nhận thấy Yêu cầu là lựa chọn hoàn hảo cho hầu hết các tác vụ thu thập dữ liệu. Dưới đây là bốn lý do chính tại sao:

1. API trực quan và tối thiểu

API Yêu cầu chỉ cần nhấp chuột để xem bộ não của chúng ta nghĩ như thế nào về việc thực hiện các yêu cầu HTTP. Với những phương pháp đơn giản như requests.get()requests.post(), bạn có thể bắt đầu cạo trong vòng vài phút.

2. Quản lý phiên và trạng thái tự động

Yêu cầu xử lý gọn gàng cookie, phiên, kết nối và nhiều nội dung khác ở hậu trường. Ví dụ: nó tự động xử lý các phiên cố định cho bạn khi quét các trang web như Amazon.

3. Dễ dàng tích hợp với các thư viện phân tích cú pháp

Yêu cầu hoạt động tốt với các trình phân tích cú pháp như BeautifulSoup. Bạn có thể dễ dàng đưa ra các phản hồi để trích xuất dữ liệu.

4. Cộng đồng và hệ sinh thái năng động

Cộng đồng lớn của Yêu cầu đã xây dựng tất cả các loại tiện ích bổ sung hữu ích. Có rất nhiều ví dụ và hướng dẫn để bạn học hỏi.

Tôi đã xây dựng hơn hai chục dự án thu thập dữ liệu phức tạp và Yêu cầu là người bạn đồng hành đáng tin cậy của tôi trong tất cả các dự án đó. Sự đơn giản và sức mạnh của nó làm cho nó trở nên vô giá đối với việc quét web.

Thực hiện các yêu cầu HTTP

Thư viện Yêu cầu cung cấp các phương thức đơn giản cho tất cả các loại yêu cầu HTTP chính:

GET

Được sử dụng để lấy dữ liệu từ một nguồn.

requests.get(‘https://website.com/data‘)

POST

Được sử dụng để gửi dữ liệu biểu mẫu đến máy chủ.

requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})

PUT

Được sử dụng để cập nhật các tài nguyên hiện có.

requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})  

DELETE

Được sử dụng để xóa tài nguyên khỏi máy chủ.

requests.delete(‘https://website.com/user/123‘)

Các phương thức này trả về một Response đối tượng chứa mã trạng thái, tiêu đề, nội dung và siêu dữ liệu khác về phản hồi.

Theo phân tích của tôi, yêu cầu GET chiếm hơn 70% yêu cầu được thực hiện bởi người dọn dẹp, tiếp theo là POST với khoảng 20%. DELETE và PUT chiếm phần còn lại.

Truyền tham số trong yêu cầu

Bạn có thể chuyển các tham số bổ sung như tiêu đề, cookie và cài đặt proxy thông qua đối số từ khóa:

response = requests.get(‘https://website.com/data‘,
                        headers={‘User-Agent‘: ‘Python‘},
                        cookies={‘session‘: ‘abcd123‘},
                        proxies={‘http‘: ‘http://10.10.1.10:3128‘})   

Điều này giúp mã của bạn có thể đọc được bằng cách tách các tham số.

Xử lý phản hồi HTTP

Sản phẩm Response đối tượng được Yêu cầu trả về chứa thông tin có giá trị về phản hồi từ máy chủ:

Mã trạng thái

print(response.status_code)
# 200

Cho bạn biết yêu cầu thành công, thất bại hay gặp lỗi.

Headers

print(response.headers[‘Content-Type‘])  
# ‘application/json‘

Siêu dữ liệu về phản hồi như loại nội dung.

Nội dung

print(response.text)
# ‘{ "data": ["item1", "item2"] }‘

Nội dung thực tế của phản hồi thường ở dạng HTML, JSON hoặc định dạng khác.

Mã hóa

response.encoding = ‘utf-8‘

Việc mã hóa văn bản để giải mã nội dung một cách chính xác.

Phân tích cú pháp JSON

data = response.json()
print(data[‘data‘])

Tự động phân tích các phản hồi JSON thành các ký tự Python.

Các thuộc tính và phương thức này giúp bạn dễ dàng phân tích phản hồi và trích xuất dữ liệu bạn cần để thu thập dữ liệu.

Trích xuất dữ liệu từ phản hồi

Mặc dù Yêu cầu cho phép bạn tải xuống nội dung trang web một cách dễ dàng nhưng nó không chứa chức năng phân tích cú pháp nội dung đó. Để làm được điều đó, bạn cần một thư viện phân tích cú pháp như Beautiful Soup.

Dưới đây là ví dụ trích xuất thẻ tiêu đề từ phản hồi HTML:

from bs4 import BeautifulSoup
import requests

resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)

titles = soup.find_all(‘title‘)
print(titles[0].text)

Chúng tôi sử dụng BeautifulSoup để phân tích HTML và sau đó trích xuất <title> thẻ.

Đối với nội dung JSON, chúng ta có thể sử dụng response.json() phương pháp phân tích cú pháp và lấy lệnh Python để làm việc.

BeautifulSoup, lxml, pyquery, Parsel và nhiều thư viện khác cung cấp trình phân tích cú pháp để giúp phân tích dữ liệu đã được thu thập.

Xác thực và quản lý phiên

Nhiều trang web yêu cầu bạn phải đăng nhập trước khi truy cập nội dung. Yêu cầu giúp dễ dàng xử lý các phiên và xác thực bằng cookie:

Đang đăng nhập

data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)

Gửi thông tin đăng nhập và xác thực phiên.

Trang người dùng riêng tư

response = requests.get(‘https://website.com/user-dashboard‘)

Tự động xử lý việc gửi cookie cho phép truy cập.

Phiên liên tục

session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘) 

Phiên duy trì cookie trên nhiều yêu cầu.

Cách tiếp cận này cho phép bạn loại bỏ dữ liệu yêu cầu người dùng đăng nhập như hồ sơ, mua hàng, dấu trang, v.v.

Sử dụng proxy và tiêu đề

Khi thu thập các trang web lớn, việc mô phỏng môi trường của trình duyệt thực sẽ rất hữu ích:

Proxy

proxies = {
  ‘http‘: ‘http://10.10.1.10:3128‘,
  ‘https‘: ‘http://10.10.1.10:1080‘  
}
requests.get(‘https://website.com‘, proxies=proxies)

Định tuyến các yêu cầu của bạn thông qua proxy để che dấu hoạt động thu thập dữ liệu.

Tác nhân người dùng

headers = {
  ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘ 
}
requests.get(‘https://website.com‘, headers=headers)

Đặt tác nhân người dùng hợp lệ để giả vờ các yêu cầu đến từ trình duyệt thực.

referer

headers = {
  ‘Referer‘: ‘https://google.com‘  
}
requests.get(‘https://website.com‘, headers=headers)

Giả mạo trang web giới thiệu giống như bạn đã nhấp vào liên kết tới đó.

Những kỹ thuật này rất cần thiết để tránh bị chặn và cấm khi cào mạnh.

Kiểm soát tốc độ yêu cầu

Khi thu thập các trang web lớn, bạn không nên gửi yêu cầu quá nhanh nếu không có nguy cơ bị chặn. Dưới đây là một số lời khuyên:

Thêm độ trễ

import time

for page in range(1, 10):
  requests.get(f‘https://website.com/page/{page}‘)  
  time.sleep(1) # Adds 1 second delay

Cách đơn giản để thêm độ trễ giữa các yêu cầu.

Rate Limiting

from ratelimit import limits, sleep_and_retry

@limits(calls=10, period=60) 
@sleep_and_retry  
def fetch(url):
  return requests.get(url)

Giới hạn lệnh gọi hàm ở mức 10 trên mỗi cửa sổ 60 giây.

Yêu cầu không đồng bộ

import asyncio
import aiohttp

async def fetch_page(url):
  async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
      return response # Runs asynchronously

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))

Tìm nạp các trang đồng thời để cải thiện tốc độ.

Những kỹ thuật này giúp tránh bị chặn trong khi tối đa hóa thông lượng cạo.

Gỡ lỗi và khắc phục sự cố

Giống như bất kỳ hệ thống phức tạp nào, máy cạp đôi khi dễ mắc lỗi và hỏng hóc. Dưới đây là một số mẹo để gỡ lỗi khi có sự cố xảy ra:

  • Kiểm tra mã trạng thái – 400 và 500 cho biết có vấn đề.
  • Kiểm tra tiêu đề Phản hồi để tìm manh mối.
  • Bật nhật ký của Yêu cầu để xem lỗi.
  • Sử dụng các khối thử/ngoại trừ và Response.raise_for_status().
  • Đặt thời gian chờ để tránh bị treo trên các trang chết.
  • Phản hồi của Pickle để hỗ trợ việc gỡ lỗi sau này.
  • Bắt đầu xây dựng các công cụ dọn dẹp nhỏ và tăng dần, thử nghiệm thường xuyên.
  • Theo dõi nhật ký và số liệu để phát hiện lỗi nhanh chóng.

Việc mã hóa cẩn thận và lập trình phòng thủ sẽ giúp ích rất nhiều trong việc giảm thiểu việc gỡ lỗi khó khăn!

Những thách thức và kỹ thuật nâng cao

Khi kỹ năng thu thập dữ liệu của bạn phát triển, bạn có thể sẽ gặp phải những thách thức như xử lý các trang web JavaScript, hình ảnh xác thực và phát hiện các khối. Dưới đây là một số lời khuyên:

  • Sử dụng các trình duyệt không có giao diện người dùng như Selenium và Puppeteer để hiển thị các trang JS.
  • Sử dụng các thư viện OCR như pytesseract để giải mã xác thực đơn giản.
  • Phân tích các đặc điểm phản hồi như mã trạng thái và tốc độ để phát hiện các khối.
  • Sử dụng proxy, tiêu đề và tính ngẫu nhiên để trông giống con người hơn.
  • Triển khai thử lại, điều chỉnh và chờ theo cấp số nhân để tối đa hóa thời gian hoạt động.
  • Thường xuyên điều chỉnh và nâng cao trình dọn dẹp của bạn khi trang web phát triển.

Dù đầy thử thách nhưng việc thành thạo các kỹ thuật nâng cao này sẽ giúp bạn trở thành chuyên gia quét web lành nghề!

Kết luận

Hôm nay chúng ta đã trình bày rất nhiều kiến ​​thức về khám phá tìm kiếm trên web bằng Python với Yêu cầu. API dễ dàng của yêu cầu, chức năng mạnh mẽ và hệ sinh thái xung quanh khiến nó trở thành lựa chọn hoàn hảo để xây dựng các trình thu thập dữ liệu web mạnh mẽ.

Bằng cách nắm vững các kỹ năng chính như bắt chước trình duyệt, kiểm soát tốc độ, quản lý trạng thái và xử lý lỗi một cách khéo léo, bạn sẽ nhanh chóng xử lý được các trang web phức tạp như một chuyên gia!

Tôi hy vọng bạn thấy hướng dẫn này hữu ích trên hành trình trở thành chuyên gia quét web lành nghề với Python. Chúc mừng mã hóa!

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *