로그에서 프록시 주소가 바뀝니다. 대상은 프록시의 접근 로그에 결코 나타나지 않습니다. 미들웨어가 요청을 다운로더까지 보내고 있는지 확인하세요.

Scrapy의 다운로더 미들웨어에서 Request를 반환한다는 것은 그 요청을 다시 예약한다는 뜻입니다. “방금 바꾼 메타데이터로 이 객체를 계속 보내라”는 뜻이 아닙니다.

경로만 고르는 선택자의 경우 중요한 형태는 다음과 같습니다.

def process_request(self, request):
    request.meta['proxy'] = self.choose_proxy()
    return None

이 조각은 현재의 훅 형태를 보여 줍니다. 설치된 Scrapy 릴리스가 지원하는 미들웨어 인터페이스를 사용하세요. 선택자는 유효한 엔드포인트를 반환해야 하고 사용할 수 없는 풀을 명시적으로 처리해야 합니다. 공개 중계자를 허용하는 공개 크롤은 그 반환 값을 위해 HTTP 프록시 목록에서 HTTP 후보를 가져올 수 있습니다.

None을 반환하면 나머지 요청 미들웨어와 다운로더가 계속 진행할 수 있습니다. 다른 Request를 반환하는 것은 작업을 의도적으로 교체하거나 다시 시도할 때 유용하지만, 이유와 종료 조건이 필요합니다.

매번 같은 요청을 반환하는 로테이터는 목적지 연결을 한 번도 맺지 않은 채 자체 선택 코드를 반복 실행할 수 있습니다. 타임아웃을 올리거나 프록시 포트를 더 열어도 그 제어 흐름 루프는 고쳐지지 않습니다.

미들웨어 진입, 반환 동작, 첫 실제 네트워크 시도를 별개의 사건으로 살펴보세요. “프록시 선택됨”이라는 로그 한 줄은 선택자가 실행되었다는 것만 증명합니다. 선택한 엔드포인트로 요청이 전송되었다는 것은 증명하지 않습니다.

관련 글