အခြား ပရောက်စီ မှတစ်ဆင့် 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 အလုပ်နှင့် ပတ်သက်သည်၊ မထင်သလို ပေးပို့ထားသော အရောင်းအဝယ်ကို ထပ်ခါတလဲလဲ လုပ်ခြင်းသည် ဘေးကင်းသည်ဟု ကတိမဟုတ်ပါ။