The proxy address changes in the log. The destination never appears in the proxy's access log. Check whether your middleware is letting the request reach the downloader at all.

In Scrapy's downloader middleware, returning a Request means rescheduling that request. It does not mean “continue sending this object with the metadata I just changed.”

For a selector that only chooses a route, the important shape is:

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

This fragment shows the current hook form; use the middleware interface supported by the installed Scrapy release. The selector must return a valid endpoint and handle an unavailable pool explicitly. A public crawl that permits public intermediaries can draw HTTP candidates from the HTTP proxy list for that return value.

Returning None lets the remaining request middleware and downloader continue. Returning another Request is useful when you intentionally replace or retry work, but it needs a reason and an exit condition.

A rotator that returns the same request every time can repeatedly run its own selection code without ever making a destination connection. Raising timeouts or opening more proxy ports cannot repair that control-flow loop.

Inspect middleware entry, return behavior, and the first actual network attempt as separate events. A log line saying “selected proxy” establishes only that the selector ran. It does not establish that a request using the selected endpoint was sent.

Artihkkalat mat laktásit