Scrapy GET نى باشقا بىر ۋاكالەتچى ئارقىلىق قايتا سىناڭ
Scrapy نىڭ قايتا سىناش ياردەمچىسىنى ئىشلىتىپ، قايتا سىناش بۇجېتىغا رىئايە قىلغان ھالدا يېڭى ۋاكالەتچى بىلەن يېڭى تەلەپ پىلانلاڭ.
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 خىزمىتى ھەققىدە، خالىغانچە يوللانغان سودىنى قايتىلاش بىخەتەر دېگەن ۋەدە ئەمەس.