@f1_rock

Как сделать задержку между отправлениями post запроса в aiohttp?

Код выполняет асинхронную проверку proxy на определенном сайте. Как я понял при большом количестве одновременных запросов сайт блокирует все запросы. Использую fake_headers, но это ничего не меняет. Подскажите как можно уменьшить количество одновременных запросов? Может есть еще какие-то варианты как улучшить программу?

Дополнительная информация:
IP использую достаточное количество, поэтому запросы проходят каждый раз по разным ip, 4-5 запроса всегда успешны.
Коды ошибок:
400, message='Bad Request', url=URL('http://81.200.123.74:80')
[WinError 10054] Удаленный хост принудительно разорвал существующее подключение
500, message='Internal Server Error', url=URL('http://35.187.4.12:8888')
403, message='Forbidden', url=URL('http://20.111.54.16:80')
407, message='Proxy Authentication Required', url=URL('http://23.229.125.132:9161')
Server disconnected
Cannot connect to host 94.130.184.102:10015 ssl:False [Connect call failed ('94.130.184.102', 10015)]


И заметил еще один момент, что коды ошибок (я их записываю в файле) где-то после 100 запросов, ответ с ошибками пропадает, строка пустая ...
from fake_headers import Headers
import asyncio
import aiohttp

async def a():
	tasks = []
	header = Headers(headers=True)

	async with aiohttp.ClientSession(trust_env=True) as session:
		with open('new_proxy') as file:
			file1 = ''.join(file.readlines()).strip().split('\n')
		for proxyes in file1:
			task = asyncio.create_task(b(session, headers = header.generate(), params = {***}, proxy = f'http://{proxyes}')
		tasks.append(task)
		await asyncio.gather(*tasks)

async def b(session, headers, params, proxy ):
	url = '***'
	try:
		async with session.post(url = url,headers=headers, json = params,proxy = proxy, ssl=False, timeout=3) as response:
			with open('proxy', 'r+', encoding='utf-8') as f:
				f.seek(0, 2) 
				f.write(f'{proxy}')
				f.write('\n')
	except Exception as e: 
		with open('proxy_error', 'r+', encoding='utf-8') as f:
			f.seek(0, 2)  
			f.write(f'{e}')
			f.write('\n')
			
if __name__ == '__main__':
	asyncio.run(a())


Нашел по данной теме:
async def loop_wrap(urls):
    for url in urls:
        asyncio.ensure_future(download(url))
        await asyncio.sleep(1/50)

asyncio.ensure_future(loop_wrap(urls))
loop.run_forever()

Пробовал его, но что-то не работает ...
  • Вопрос задан
  • 238 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы