Прызначэнне URL і проксі для кожнай задачы Python ThreadPoolExecutor
Прызначце проксі перад адпраўкай задачы запыту Python, замест таго каб працаўнікі спаборнічалі за агульны зменлівы стан выбару.
Метад map пула перадае працаўніку па адным элеменце за раз. Зрабіце гэты элемент поўнай задачай, уключаючы URL і выбраны проксі, каб працаўнік не выводзіў свой маршрут са зменлівага глабальнага спіса.
Для канчатковых urls падайце непусты спіс правераных URL проксі. Публічныя кандыдаты HTTP даступныя ў спісе HTTP-проксі:
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 падаюцца праграмай. Каардынатар прызначае канчатковыя пункты ў паўтаральным парадку; кожны працаўнік атрымлівае адну фіксаваную пару. Перабор вынікаў таксама выяўляе выключэнні працаўнікоў.
Пяць працаўнікоў абмяжоўваюць актыўныя задачы, а не актыўныя задачы на адзін проксі. Калі ў спісе два канчатковыя пункты, некалькі задач могуць адначасова выкарыстоўваць адзін і той жа пункт. Дадайце асобнае правіла ёмістасці для кожнага пункта, калі гэта патрэбна. Для адной актыўнай задачы на URL пункта сінхранізаваная арэнда чаргі можа рэзерваваць і вяртаць кожны запіс.
Паўторная спроба павінна ствараць новую абмежаваную спробу для таго ж URL. Пазбягайце рэкурсіўных выклікаў паўтору, якія выдаляюць запісы з агульнага спіса: іншы працаўнік можа выбіраць з яго, а вычарпаны спіс усё яшчэ патрабуе яўнага выніку.