Tôi hiện đang làm việc trên một dự án scraper, điều quan trọng là đảm bảo mọi yêu cầu đã được xử lý đúng cách, tức là, hoặc để ghi lại lỗi hoặc lưu kết quả thành công. Tôi đã triển khai spider cơ bản và bây giờ tôi có thể xử lý 99% yêu cầu thành công, nhưng tôi có thể gặp lỗi như captcha, 50x, 30x hoặc thậm chí không có đủ trường trong kết quả (sau đó tôi sẽ thử một trang web khác để tìm các trường bị thiếu). Đầu tiên, tôi nghĩ rằng nó "hợp lý hơn" để tăng ngoại lệ trong việc gọi lại phân tích cú pháp và xử lý tất cả chúng trong errback, điều này có thể làm cho mã dễ đọc hơn. Quay lại đầu trang | Nhưng tôi đã cố gắng chỉ để tìm ra errback chỉ có thể bẫy lỗi trong mô-đun tải xuống, chẳng hạn như trạng thái phản hồi không 200. Nếu tôi nâng ParseError tự thực hiện trong cuộc gọi lại, con nhện chỉ tăng nó lên và dừng lại.làm thế nào để xử lý tất cả các loại ngoại lệ trong một dự án cồng kềnh, trong errback và gọi lại?
Ngay cả khi tôi sẽ phải xử lý yêu cầu phân tích trực tiếp trong cuộc gọi lại, tôi không biết cách thử lại yêu cầu ngay lập tức trong cuộc gọi lại theo cách sạch sẽ. bạn biết đấy, tôi có thể phải bao gồm một proxy khác để gửi yêu cầu khác hoặc sửa đổi một số tiêu đề yêu cầu.
Tôi thừa nhận mình khá mới mẻ nhưng tôi đã cố gắng qua lại trong nhiều ngày và vẫn không thể làm việc này ... Tôi đã kiểm tra mọi câu hỏi trên SO và không ai khớp, cảm ơn trước vì Cứu giúp.
UPDATE: Tôi nhận ra điều này có thể là một câu hỏi rất phức tạp vì vậy tôi cố gắng để minh họa kịch bản trong mã giả sau đây, hy vọng điều này sẽ giúp:
from scraper.myexceptions import *
def parseRound1(self, response):
.... some parsing routines ...
if something wrong happened:
# this causes the spider raises a SpiderException and stops
raise CaptchaError
...
if no enough fields scraped:
raise ParseError(task, "no enough fields")
else:
return items
def parseRound2(self, response):
...some other parsing routines...
def errHandler(self, failure):
# how to trap all the exceptions?
r = failure.trap()
# cannot trap ParseError here
if r == CaptchaError:
# how to enqueue the original request here?
retry
elif r == ParseError:
if raised from parseRound1:
new request for Round2
else:
some other retry mechanism
elif r == HTTPError:
ignore or retry
cảm ơn vì đã làm rõ trách nhiệm của 'callback' và' err back'! Điều này đã làm tôi bối rối trong một thời gian dài .. đoán tôi nên đã tìm ra nó bằng cách viết một số nhện kiểm tra trước đó ... –