URL և proxy նշանակել յուրաքանչյուր Python ThreadPoolExecutor աշխատանքի
Նշանակեք proxy նախքան Python հարցման աշխատանքը ներկայացնելը՝ փոխարենը թույլ տալու աշխատողներին մրցել ընդհանուր փոփոխվող ընտրության վիճակի համար:
Ավազանի map-ը մեկ անգամ մեկ տարր է փոխանցում աշխատողին: Այդ տարրը դարձրեք ամբողջական աշխատանք՝ ներառյալ URL-ը և ընտրված proxy-ն, որպեսզի աշխատողը չենթադրի իր ուղին փոփոխվող գլոբալ ցանկից:
Վերջավոր urls-ի համար տրամադրեք վավերացված proxy URL-ների ոչ դատարկ ցանկ: Հանրային HTTP թեկնածուները հասանելի են HTTP proxy ցանկում-ում:
from concurrent.futures import ThreadPoolExecutor
from itertools import cycle
import requests
def fetch(job):
url, proxy_url = job
proxies = {"http": proxy_url, "https": proxy_url}
with requests.get(url, proxies=proxies, timeout=(5, 15)) as response:
response.raise_for_status()
return url, response.text
if not proxy_urls:
raise ValueError("No proxy endpoints were supplied")
jobs = zip(urls, cycle(proxy_urls))
with ThreadPoolExecutor(max_workers=5) as executor:
for url, body in executor.map(fetch, jobs):
handle_result(url, body)urls-ը, proxy_urls-ը և handle_result-ը տրամադրվում են հավելվածի կողմից: Համակարգողը վերջնակետերը նշանակում է կրկնվող հերթականությամբ. յուրաքանչյուր աշխատող ստանում է մեկ ֆիքսված զույգ: Արդյունքների կրկնումը նաև բացահայտում է աշխատողների բացառությունները:
Հինգ աշխատող սահմանափակում են ակտիվ աշխատանքները, ոչ թե յուրաքանչյուր proxy-ի ակտիվ աշխատանքները: Եթե ցանկում երկու վերջնակետ կա, մի քանի աշխատանք կարող են միաժամանակ օգտագործել նույն վերջնակետը: Անհրաժեշտության դեպքում ավելացրեք առանձին հզորության կանոն յուրաքանչյուր վերջնակետի համար: Յուրաքանչյուր վերջնակետի URL-ի համար մեկ ակտիվ աշխատանքի դեպքում համաժամեցված հերթի վարձույթ-ը կարող է ամրագրել և վերադարձնել յուրաքանչյուր գրառում:
Կրկնվող փորձը պետք է ստեղծի նոր սահմանափակ փորձ նույն URL-ի համար: Խուսափեք ռեկուրսիվ կրկնվող փորձի կանչերից, որոնք գրառումներ են հեռացնում ընդհանուր ցանկից. մեկ այլ աշխատող կարող է դրանից ընտրել, և սպառված ցանկը դեռ պահանջում է հստակ արդյունք: