response.request.meta-г өөрчлөх нь Python объектыг өөрчилдөг. Дахин татахын тулд Scrapy-д төлөвлөх өөр Request өгөх шаардлагатай.

Таны callback дахин оролдохыг тодорхой шийдсэн GET-ийн хувьд Scrapy-н нийтийн дахин оролдлогын туслах нь дахин оролдлогын тооцоог шинэ хүсэлттэй хамт хадгалж чадна:

from scrapy.downloadermiddlewares.retry import get_retry_request

def retry_through(self, response, proxy_url):
    retry = get_retry_request(
        response.request,
        spider=self,
        reason='choose_another_proxy',
    )
    if retry is None:
        return None
    retry.meta['proxy'] = proxy_url
    retry.headers.pop('Proxy-Authorization', None)
    return retry

Энэ бол spider-н туслах юм. Дуудагч нь боломжтой үед үүссэн Request-ийг буцаах эсвэл yield хийх ёстой. None нь туслах хэрэглэгдэх хязгаарын дотор дахин оролдлогоос татгалзсаныг илэрхийлнэ.

Дахин оролдлогын туслах нь хүсэлтийг хуулж, дахин оролдлогын тоолуурыг шинэчилж, дахин оролдлогод тохирох хуваарьлагчийн зан үйлийг өгдөг. Ижил URL-ийг энгийн шинэ хүсэлт болгон yield хийвэл харин давхардлын шүүлтэд тулгарч болно.

Асаалттай HttpProxyMiddleware-ийн дэмждэг прокси URL-ийг ашиглана уу. Зөвшөөрөгдсөн нийтийн GET хүсэлтийг дахин оролдоход HTTP прокси жагсаалтаас баталгаажуулалтгүй HTTP нэр дэвшигч proxy_url-ийг өгч чадна. Өмнө нь хавсаргасан proxy-authorization талбарыг арилгах нь хуучин зуучлагчийн толгойг энэ сонголт руу оруулахаас сэргийлнэ; тохиолдолд middleware-д шинэ бүртгэлийг шинэ прокси URL-ээс гаргахыг зөвшөөрнө үү.

Энэ callback түвшний сонголтыг RetryMiddleware-ийн тохируулсан алдааг автоматаар зохицуулахаас тусад нь байлгаарай. Дахин оролдлого аль давхаргад хамаарахыг шийдэж, үйлдэл хоёр бие даасан төсөв зарцуулахгүй байх ёстой. Жишээ нь дахин тоглуулж болох GET ажлын тухай бөгөөд дур мэдэн илгээсэн гүйлгээг давтах нь аюулгүй гэсэн амлалт биш юм.

Холбоотой нийтлэлүүд