async вызов функции с http request
Мне нужно обработать 80к доменов (считав для каждого данные webarchive) и я сделал скрипт на python, который это делает. Но он делает это последовательно и медленно.. Так я только начал изучать python, я никак не могу разобраться с многопоточностью... и прошу помощи у сообщества.
У меня есть участок кода, который создает пул задач (передавая в него i - это номер домена в DataFrame)
loop = asyncio.get_event_loop()
tasks = [askarchive(i, 1) for i in tqdm(range(len(df)))]
loop.run_until_complete(
asyncio.gather(*tasks)
)
loop.close()
И он вызывает функцию, которая должна в многопоточном режиме с применением прокси делать запросы к вебархиву.. И вот тут у меня возникли сложности - чего я только не перепробовал - ничего не выходит :(
async def askarchive(i, type):
global df
url = df.domain[i]
session = requests.session()
result = False
while not result:
try:
if type == 1: # Кол-во главных за год
print ('checking domain'+str(i))
response = session.get ('http://web.archive.org/cdx/search/cdx?url=' + url + '&output=json&from='
+ str(datefrom) + '&to=' + str(dateto) + '&filter=statuscode:200', proxies = next_proxy(),
timeout=1)
print(response.text)
if type == 2: # Кол-во уник страниц в вебархиве
response = session.get('http://web.archive.org/cdx/search/cdx?url=' + url +
'&matchType=domain&limit=200&output=json&from=' + str(datefrom) + '&to='
+ str(dateto) + '&filter=statuscode:200&filter=mimetype:text/html',
proxies = next_proxy(), timeout=1)
#print(response.text)
if any(word in response.text for word in errors):
result = False
elif '404 Not Found' in response.text:
print ('Домен главных 0' + df.domain[i])
df.at[i, 'armains'] = 0
df.at[i, 'wapages'] = 0
else:
if type == 1:
df.at[i, 'armains'] = int(response)
print ('Домен трафик ' + df.domain[i] + str(df.armains[i]))
if type == 2:
df.at[i, 'wapages'] = int(response)
print ('Домен страниц ' + df.domain[i] + str(df.wapages[i]))
except requests.exceptions.ConnectionError:
# print ("Удаляем прокси" + str(proxylist.pop(proxynum))+ "осталось прокси в списке: "+str(len(proxylist)))
result = False
except requests.exceptions.ReadTimeout:
# print ("Удаляем прокси" + str(proxylist.pop(proxynum))+ "осталось прокси в списке: "+str(len(proxylist)))
result = False