URL és proxy hozzárendelése minden Python ThreadPoolExecutor-feladathoz
Proxy hozzárendelése a Python kérésfeladat beküldése előtt, ahelyett hogy a munkások egy megosztott, változó kiválasztási állapotért versenyeznének.
A pool map metódusa egyszerre egy elemet ad át a munkásnak. Tedd ezt az elemet teljes feladattá, beleértve az URL-t és a kiválasztott proxyt, hogy a munkás ne egy változó globális listából következtessen az útvonalára.
Véges számú urls esetén adj meg egy nem üres listát érvényesített proxy URL-ekből. Nyilvános HTTP-jelöltek a HTTP-proxy listán oldalon érhetők el:
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)Az urls, proxy_urls és handle_result értékeket az alkalmazás biztosítja. A koordinátor ismétlődő sorrendben osztja ki a végpontokat; minden munkás egy rögzített párt kap. Az eredmények bejárása a munkások kivételeit is felszínre hozza.
Öt munkás az aktív feladatokat korlátozza, nem a proxynkénti aktív feladatokat. Ha a listán két végpont van, több feladat is használhatja ugyanazt a végpontot egyidejűleg. Ha szükséges, adj hozzá külön végpontonkénti kapacitásszabályt. Végpontonkénti URL-enként egy aktív feladathoz a szinkronizált sorlízing minden bejegyzést lefoglalhat és visszaadhat.
Az újrapróbálkozásnak új, korlátozott kísérletet kell létrehoznia ugyanahhoz az URL-hez. Kerüld azokat a rekurzív újrapróbálkozási hívásokat, amelyek bejegyzéseket távolítanak el egy megosztott listáról: lehet, hogy egy másik munkás éppen abból választ, és a kimerült listának továbbra is kifejezett eredményre van szüksége.