Почему асинхронный код на Python не выполняется черек прокси сервер?

Как можно настроить асинхронную часть кода, чтобы работал вместе с проксификсером, который был установлен на `python.exe` в виртуальной среде? При использовании SOCKS5 или HTTP прокси все работает до момента перехода к асинхронной части кода, где работа прекращается и происходит бесконечное ожидание без возникновения исключений. Если попытаться запустить код в режиме отладки в PyCharm под проксификсером, возникает исключение `ConnectionRefusedError: [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение`.
  • 13 марта 2024 г. 9:19
Ответы на вопрос 2
Возможно, проблема заключается в том, что асинхронный код не поддерживает использование прокси-сервера напрямую. Для того чтобы асинхронный код корректно работал через прокси-сервер, необходимо использовать специальные библиотеки, которые поддерживают асинхронные запросы через прокси.

Одним из таких инструментов является aiohttp, который предоставляет возможность делать асинхронные HTTP-запросы. Вы можете настроить прокси-сервер в aiohttp следующим образом:

```python
import aiohttp

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url, proxy="http://your-proxy-server:port") as response:
            return await response.text()

url = 'http://example.com'
result = await fetch(url)
print(result)
```

Замените `'http://your-proxy-server:port'` на адрес вашего прокси-сервера. Убедитесь, что ваш прокси-сервер корректно настроен и подключен.

Если вы используете SOCKS5 прокси, то можете воспользоваться библиотекой aiohttp-socks, которая добавляет поддержку SOCKS прокси в aiohttp:

```python
import aiohttp
import aiohttp_socks

async def fetch(url):
    connector = aiohttp_socks.ProxyConnector.from_url('socks5://your-socks5-proxy-server:port')
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get(url) as response:
            return await response.text()

url = 'http://example.com'
result = await fetch(url)
print(result)
```

С помощью данных библиотек вы сможете корректно настроить асинхронную часть кода для работы через прокси-сервер.
Посмотрите этот код, может, поможет: <br/> import asyncio <br/> import os <br/> import time <br/> import random <br/> from time import perf_counter <br/> import aiohttp <br/> import aiofiles <br/> <br/> SITE = ' <a href="https://thispersondoesnotexist.com/" rel="nofollow">https://thispersondoesnotexist.com/</a> ' <br/> IMAGE_COUNT = 50 <br/> PROXY = '' <br/> <br/> def generate_filename(file_extension): <br/> temp = str(int(time.time())) <br/> for _ in range(5): <br/> temp += chr(random.randint(65, 75)) <br/> return f'{temp}.{file_extension}' <br/> <br/> async def download_image(image_num): <br/> async with aiohttp.ClientSession() as session: <br/> async with session.get(SITE, proxy=f' <a href="">http://{PROXY</a> }') as response: <br/> extension = response.headers['content-type'].split('/')[-1] <br/> filename = os.path.join('Images_async', generate_filename(extension)) <br/> <br/> async with aiofiles.open(filename, mode='wb') as file: <br/> async for chunk in response.content.iter_chunked(64 * 1024): <br/> await file.write(chunk) <br/> print(f'image: {image_num + 1} finished...') <br/> <br/> async def main(): <br/> image_tasks = [] <br/> for image_num in range(IMAGE_COUNT): <br/> image_tasks.append(asyncio.create_task(download_image(image_num))) <br/> await asyncio.gather(*image_tasks) <br/> <br/> if __name__ == '__main__': <br/> start = perf_counter() <br/> asyncio.run(main()) <br/> print(f'time:  {(perf_counter() - start):.02f}') <br/> <br/> Я этот код увидел в процессе обучения. Он работает.
Похожие вопросы