Tôi mới sử dụng phần mềm này. Tôi đang viết một con nhện được thiết kế để kiểm tra danh sách dài các url cho mã trạng thái máy chủ và khi thích hợp, chúng sẽ được chuyển hướng đến URL nào. Quan trọng hơn, nếu có một chuỗi các chuyển hướng, tôi cần phải biết mã trạng thái và url ở mỗi bước nhảy. Tôi đang sử dụng response.meta ['redirect_urls'] để ghi lại các url nhưng không chắc chắn cách nắm bắt các mã trạng thái - dường như không có khóa meta phản hồi cho nó.Chụp mã trạng thái http bằng con nhện bị lột
Tôi nhận ra mình có thể cần phải viết một số đồ lót tùy chỉnh để hiển thị các giá trị này nhưng không rõ cách đăng nhập mã trạng thái cho mỗi hop cũng như cách truy cập các giá trị này từ nhện. Tôi đã có một cái nhìn nhưng không thể tìm thấy một ví dụ về bất cứ ai làm điều này. Nếu bất cứ ai có thể chỉ cho tôi đúng hướng nó sẽ được nhiều đánh giá cao.
Ví dụ,
items = []
item = RedirectItem()
item['url'] = response.url
item['redirected_urls'] = response.meta['redirect_urls']
item['status_codes'] = #????
items.append(item)
Sửa - Dựa trên phản hồi từ warawauk và một số sự giúp đỡ thực sự chủ động từ những kẻ trên kênh IRC (freenode #scrappy) Tôi đã quản lý để làm điều này. Tôi tin rằng đó là một chút hacky vì vậy bất kỳ ý kiến để cải thiện chào đón:
(1) Vô hiệu hoá các middleware mặc định trong các thiết lập, và thêm của riêng bạn:
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': None,
'myproject.middlewares.CustomRedirectMiddleware': 100,
}
(2) Tạo CustomRedirectMiddleware của bạn trong middlewares của bạn .py. Nó kế thừa từ lớp redirectmiddleware chính và nắm bắt được chuyển hướng:
class CustomRedirectMiddleware(RedirectMiddleware):
"""Handle redirection of requests based on response status and meta-refresh html tag"""
def process_response(self, request, response, spider):
#Get the redirect status codes
request.meta.setdefault('redirect_status', []).append(response.status)
if 'dont_redirect' in request.meta:
return response
if request.method.upper() == 'HEAD':
if response.status in [301, 302, 303, 307] and 'Location' in response.headers:
redirected_url = urljoin(request.url, response.headers['location'])
redirected = request.replace(url=redirected_url)
return self._redirect(redirected, request, spider, response.status)
else:
return response
if response.status in [302, 303] and 'Location' in response.headers:
redirected_url = urljoin(request.url, response.headers['location'])
redirected = self._redirect_request_using_get(request, redirected_url)
return self._redirect(redirected, request, spider, response.status)
if response.status in [301, 307] and 'Location' in response.headers:
redirected_url = urljoin(request.url, response.headers['location'])
redirected = request.replace(url=redirected_url)
return self._redirect(redirected, request, spider, response.status)
if isinstance(response, HtmlResponse):
interval, url = get_meta_refresh(response)
if url and interval < self.max_metarefresh_delay:
redirected = self._redirect_request_using_get(request, url)
return self._redirect(redirected, request, spider, 'meta refresh')
return response
(3) Bây giờ bạn có thể truy cập vào danh sách chuyển hướng trong nhện của bạn với
request.meta['redirect_status']
Bạn nên đăng giải pháp của mình làm câu trả lời – raben