Python Try Except cho Công Cụ Gắp Dữ Liệu Web Đáng Tin Cậy 2026
Python try except là sự khác biệt giữa một trình thu thập dữ liệu dừng lại sau một yêu cầu không hợp lệ và một trình thu thập dữ liệu tiếp tục hoạt động bất chấp các sự cố mạng. Trong việc thu thập dữ liệu sản xuất, lỗi là điều bình thường. Một máy chủ có thể hết thời gian chờ, một proxy có thể thất bại, một trang có thể trả về 403 hoặc một bộ chọn có thể bị hỏng sau khi thay đổi bố cục. Hướng dẫn này giải thích try, except, else, và finally qua lăng kính của các trình thu thập dữ liệu có độ sẵn sàng cao. Nó được viết cho các lập trình viên Python những người đã gửi yêu cầu HTTP và hiện cần xử lý lỗi an toàn hơn. Bạn sẽ học cách bắt các ngoại lệ cụ thể, thử lại với thời gian chờ, xoay vòng các proxy, giải phóng tài nguyên và sử dụng Nstproxy như một phần của quy trình làm việc với proxy ổn định.
Những điểm chính
Sử dụng python try except để xử lý các lỗi dự kiến của trình thu thập dữ liệu mà không che giấu lỗi.
Bắt các ngoại lệ cụ thể như Timeout, ProxyError, và HTTPError.
Sử dụng else để phân tích chỉ sau khi yêu cầu thành công.
Sử dụng finally để dọn dẹp, đóng phiên và ghi nhận số liệu.
Kết hợp logic thử lại với xoay vòng proxy khi các lỗi mạng lặp lại.
Các ngoại lệ thường gặp trong thu thập dữ liệu web
Các trình thu thập dữ liệu thất bại theo các mẫu, vì vậy việc xử lý ngoại lệ nên khớp với các mẫu đó. Đối xử với các lỗi mạng, lỗi proxy, lỗi trạng thái HTTP, và lỗi phân tích như các sự kiện khác nhau.
Trải nghiem Nstproxy - Bat dau dung thu mien phi ngay
Loại thất bại
Nguyên nhân phổ biến
Ngoại lệ hoặc tín hiệu điển hình
Hành động
Hết thời gian
Máy chủ chậm hoặc mạng kém
requests.exceptions.Timeout
Thử lại với thời gian chờ
Thất bại proxy
Proxy chết hoặc vấn đề xác thực
requests.exceptions.ProxyError
Chuyển đổi proxy
Thất bại kết nối
DNS, thiết lập lại, từ chối kết nối
ConnectionError
Thử lại hoặc tạm dừng
Khối HTTP
403, 407, 429
Mã trạng thái
Xoay vòng proxy hoặc giảm tốc độ
Thất bại phân tích
HTML đã thay đổi
AttributeError, KeyError
Ghi lại và cập nhật bộ phân tích
Thất bại JSON
Nội dung phản hồi không hợp lệ
ValueError
Xác thực kiểu nội dung
Tài liệu chính thức requests liệt kê các ngoại lệ như Timeout, TooManyRedirects, và HTTPError trong hướng dẫn về lỗi và ngoại lệ. Python cũng tài liệu hóa việc xử lý ngoại lệ trong Lỗi và Ngoại lệ.
Quy tắc chính rất đơn giản. Bắt những gì bạn có thể phục hồi. Để các lỗi không xác định hiện ra trong quá trình phát triển.
Những kiến thức cơ bản về Python Try Except cho Trình thu thập dữ liệu
Python try except chỉ nên bảo vệ các hoạt động mạo hiểm. Trong một trình thu thập dữ liệu, điều đó thường có nghĩa là yêu cầu, kiểm tra trạng thái, bước phân tích, hoặc bước lưu trữ. Giữ cho mỗi khối nhỏ đủ để giải thích.
import requests
url ="https://example.com/products"try: response = requests.get(url, timeout=10) response.raise_for_status()except requests.exceptions.Timeout:print("Yêu cầu đã vượt quá thời gian; lên lịch thử lại.")except requests.exceptions.HTTPError as exc:print(f"Lỗi HTTP: {exc.response.status_code}")except requests.exceptions.RequestException as exc:print(f"Lỗi mạng: {exc}")else: html = response.text
print("An toàn để phân tích trang bây giờ.")
Mẫu này tốt hơn so với except: rộng. Nó phân tách các trường hợp hết thời gian, lỗi HTTP, và các lỗi yêu cầu chung. Nó cũng giữ việc phân tích trong khối else, chỉ chạy sau khi yêu cầu thành công.
Tránh mẫu này trong sản xuất:
try: response = requests.get(url)except:pass
Nó che giấu các lỗi thực sự. Nó cũng tạo ra các khoảng trống dữ liệu im lặng, khó khắc phục hơn là các lỗi rõ ràng.
Bắt Các Lỗi Proxy và Xoay Vòng Các IP
Các lỗi proxy cần có nhánh riêng vì cách khắc phục khác với một thử lại bình thường. Nếu một điểm cuối proxy thất bại, lặp lại cùng một yêu cầu qua cùng một proxy có thể lãng phí thời gian. Trình thu thập dữ liệu nên đánh dấu proxy là không khỏe mạnh và thử một cái khác.
import requests
deffetch_with_proxy(url, proxy): proxies ={"http": proxy,"https": proxy,}try: response = requests.get(url, proxies=proxies, timeout=12) response.raise_for_status()except requests.exceptions.ProxyError:return{"ok":False,"reason":"proxy_error","retry":True}except requests.exceptions.Timeout:return{"ok":False,"reason":"timeout","retry":True}except requests.exceptions.HTTPError as exc: status = exc.response.status_code
return{"ok":False,"reason":f"http_{status}","retry": status in(403,407,429)}except requests.exceptions.RequestException as exc:return{"ok":False,"reason":str(exc),"retry":True}else:return{"ok":True,"html": response.text}
Cấu trúc này làm cho quyết định thử lại rõ ràng hơn. Một ProxyError có thể kích hoạt việc thay thế proxy. Một lỗi 429 có thể kích hoạt tốc độ chậm hơn. Một lỗi 403 có thể kích hoạt việc xem xét lại các tiêu đề, hành vi phiên, hoặc chất lượng proxy.
Nstproxy tự nhiên phù hợp ở đây. Nếu công cụ scraping của bạn sử dụng một hồ bơi proxy quay vòng, Nstproxy có thể cung cấp các nguồn proxy sạch hơn cho quy trìnhRetry. Sự xoay vòng IP thông minh và phạm vi toàn cầu của nó giảm khả năng bị chặn, CAPTCHAs và giới hạn tốc độ, cho phép các công cụ scraping truy cập thông tin công khai một cách quy mô.
Khối else tốt nhất cho công việc chỉ nên chạy sau khi không có ngoại lệ nào xảy ra. Trong việc scraping, hãy đặt parsing hoặc extraction ở đó. Điều này ngăn cản bộ phân tích của bạn chạy trên một phản hồi thiếu hoặc không thành công.
Khối finally tốt nhất để dọn dẹp. Sử dụng nó để đóng phiên, giải phóng các trang trình duyệt, cập nhật số liệu hoặc trả lại một mã proxy cho hồ bơi. Tránh các logic kinh doanh phức tạp trong finally.
session = requests.Session()try: response = session.get(url, timeout=10) response.raise_for_status()except requests.exceptions.RequestException as exc: logger.warning("fetch_failed", extra={"url": url,"error":str(exc)})else: title = parse_title(response.text) save_record(url, title)finally: session.close()
Điều này được đọc như một vòng đời của crawler. Hãy thử yêu cầu. Xử lý các thất bại đã biết. Phân tích chỉ khi thành công. Dọn dẹp mỗi lần.
Tài liệu Python cũng hỗ trợ việc tái ném ngoại lệ khi người gọi nên quyết định điều gì xảy ra tiếp theo. Điều đó hữu ích khi một chức năng lấy dữ liệu ở mức thấp không nên giấu một thất bại khỏi bộ lập lịch công việc.
Chiến lược Retry Sản xuất
Logic retry trong sản xuất nên được giới hạn, có thể quan sát được và lịch sự. Các lần thử lại vô hạn có thể làm quá tải một trang web mục tiêu và lãng phí băng thông proxy. Một mẫu an toàn hơn là backoff lũy thừa với jitter, giới hạn retry và các quyết định nhận thức trạng thái.
Dự án urllib3 cung cấp tài liệu về tiện ích Retry để xử lý hành vi retry trong các khách hàng HTTP. Xem urllib3 Retry để biết các khái niệm cơ bản.
Kích hoạt Retry
Retry?
Hành động bổ sung
Timeout
Có
Tăng thời gian backoff
ProxyError
Có
Thay thế proxy
403
Đôi khi
Xem lại tiêu đề và danh tiếng proxy
407
Có
Kiểm tra xác thực proxy
429
Có
Giảm tốc độ và xoay IP
404
Không
Ghi lại trang bị thiếu
Lỗi phân tích
Không thử lại ngay lập tức
Ghi lại mẫu HTML
Mã sản xuất nên ghi lại mỗi lần thử. Bao gồm URL, mã trạng thái, loại ngoại lệ, ID proxy, số lần thử lại và kết quả cuối cùng. Những trường này giúp bạn phân tách các proxy kém khỏi bộ phân tích kém.
Nstproxy có thể giảm tiếng ồn ở lớp mạng bằng cách cung cấp cho các crawler một nguồn proxy được quản lý thay vì các proxy miễn phí ngẫu nhiên. Các nhóm cũng có thể sử dụng kiểm tra proxy miễn phí trong quá trình chẩn đoán và proxy dân cư cho các quy trình cần hồ sơ mạng thực tế.
Tóm tắt So sánh: Simple Try Except so với Xử lý Sản xuất
Các ví dụ đơn giản về python try except khá tốt cho việc học. Các công cụ scraping sản xuất cần nhiều cấu trúc hơn vì cùng một ngoại lệ có thể có nghĩa là các hành động khác nhau.
Khu vực
Mẫu Người mới bắt đầu
Mẫu Công cụ Scraper Sản xuất
Loại ngoại lệ
Bắt tất cả các lỗi
Bắt các ngoại lệ cụ thể
Xử lý proxy
Thử lại cùng yêu cầu
Thay thế proxy khi có lỗi proxy
Mã trạng thái HTTP
Bỏ qua hoặc in
Chuyển hướng theo 403, 407, 429, 5xx
Ghi nhật ký
Đầu ra console
Ghi nhật ký có cấu trúc với ID proxy
Retry
Vòng lặp thủ công
Backoff, jitter, cố gắng tối đa
Phân tích
Phân tích trong try
Phân tích trong else sau khi thành công
Dọn dẹp
Thường bị bỏ qua
finally đóng các phiên
Quy trình Thực tế cho một Scraper Có Sẵn Cao
Một crawler ổn định nên coi các thất bại như dữ liệu. Mỗi yêu cầu thất bại nên cập nhật quyết định tiếp theo.
Sử dụng quy trình này:
Chọn một URL và proxy.
Gửi yêu cầu với một thời gian chờ.
Bắt các ngoại lệ mạng và proxy cụ thể.
Thử lại với backoff khi lỗi có thể phục hồi.
Xoay proxy trên ProxyError, 407, 403 lặp lại hoặc 429 lặp lại.
Phân tích chỉ sau một phản hồi sạch.
Ghi lại kết quả cuối cùng.
Lưu URL thất bại để xem xét sau.
Quy trình này cải thiện tỷ lệ sống sót mà không giấu diếm các khuyết tật thực sự. Nó cũng giúp các nhóm quyết định khi nào vấn đề nằm ở trang mục tiêu, bộ phân tích, mẫu yêu cầu hoặc hồ bơi proxy.
Nó cho phép Python chạy mã có rủi ro trong khối try và xử lý các lỗi dự kiến trong một hoặc nhiều khối except. Trong các trình thu thập dữ liệu, nó ngăn một yêu cầu thất bại không làm dừng toàn bộ công việc.
Tôi có nên bắt Exception trong trình thu thập dữ liệu không?
Hãy bắt các ngoại lệ cụ thể trước tiên. Chỉ sử dụng Exception ở một ranh giới nơi bạn ghi lại lỗi và giữ cho công việc tiếp tục. Tránh sử dụng except: bare vì nó có thể che giấu lỗi.
Tôi xử lý lỗi proxy trong yêu cầu Python như thế nào?
Bắt requests.exceptions.ProxyError, đánh dấu proxy là không khỏe mạnh, sau đó thử lại với một proxy khác. Cũng hãy ghi lại ID proxy, URL và số lần thử lại.
Mã phân tích có nên nằm trong try hay else?
Đặt việc phân tích trong else khi nó phụ thuộc vào một yêu cầu thành công. Điều này giữ cho các phản hồi thất bại không đến với bộ phân tích của bạn.
Nstproxy giúp nâng cao độ tin cậy của trình thu thập dữ liệu như thế nào?
Nstproxy cung cấp cơ sở hạ tầng proxy có thể hỗ trợ quy trình thử lại và luân chuyển IP. Nó giúp giảm thiểu các lỗi do nguồn proxy chất lượng thấp hoặc không ổn định gây ra.
Kết luận
Python try except không chỉ là cú pháp cho người mới bắt đầu khi bạn xây dựng các trình thu thập dữ liệu. Đó là lớp điều khiển giữ cho công việc tiếp tục sống sót qua các thời gian chờ, lỗi proxy, chặn HTTP và thay đổi bộ phân tích.
Bắt đầu từ những điều nhỏ. Bắt các ngoại lệ cụ thể. Sử dụng else cho việc phân tích và finally cho việc dọn dẹp. Thêm các lần thử lại có giới hạn với việc trở lại. Luân chuyển proxies khi lỗi liên quan đến mạng. Đối với các nhóm cần cơ sở hạ tầng proxy ổn định hơn, Nstproxy là một lựa chọn thực tế cho quy trình thu thập dữ liệu Python.