Как использовать библиотеку cfscrape для выполнения асинхронных запросов?

Как можно асинхронно выполнить 10 запросов с использованием библиотек aiohttp и cfscrape? Я знаю, что есть aiocfscrape, но кажется, что он устарел, так как при его использовании возникает ошибка Cloudflare. Вот мой текущий код:

```python
import cfscrape
import asyncio 
import aiohttp

site = "https://randomfox.ca/floof/"

async def req(site):
    async with aiohttp.ClientSession() as session:
        session = cfscrape.create_scraper(sess=session)
        response = session.get(site)
        print(response.json()["image"])

async def run():
    tasks = []
    for c in range(10):
        tasks.append(asyncio.create_task(req(site)))
    await asyncio.wait(tasks)

asyncio.run(run())
```

Я хочу, чтобы эти 10 запросов выполнялись асинхронно с использованием cfscrape.
  • 22 января 2024 г. 19:28
Ответы на вопрос 2
Библиотека `cfscrape` используется для обхода защиты от ботов Cloudflare, но она предназначена только для синхронного использования и не поддерживает асинхронные операции. Однако, вы хотите использовать асинхронные запросы в своем коде. Для таких целей ранее использовалась упомянутая вами библиотека `aiocfscrape`, но, как вы заметили, она может быть устаревшей или не работать как ожидается.

Тогда для реализации асинхронных запросов с обходом Cloudflare, вы можете попробовать другие решения, в том числе:

- Использовать браузерную автоматизацию с помощью `pyppeteer` или `playwright`, которые могут эмулировать поведение браузера и обойти Cloudflare.
- Искать другие альтернативные библиотеки или решения, которые могут работать с Cloudflare асинхронно.
- Рассмотреть возможность использования резервных API или других источников, если это возможно.

Если вы всё же хотите использовать `aiohttp` для отправки запросов, приведу пример того, как вы можете асинхронно сделать 10 запросов без использования `cfscrape`. Обратите внимание, что этот код не обходит защиту Cloudflare, но демонстрирует асинхронные запросы:

```python
import aiohttp
import asyncio

site = "https://randomfox.ca/floof/"

async def fetch(session, url):
    async with session.get(url) as response:
        if response.status == 200:
            data = await response.json()
            print(data["image"])
        else:
            print(f"Error: {response.status}")

async def run():
    async with aiohttp.ClientSession() as session:
        tasks = [asyncio.create_task(fetch(session, site)) for _ in range(10)]
        await asyncio.gather(*tasks)

asyncio.run(run())
```

Здесь мы создаем 10 задач, каждая из которых выполняет функцию `fetch`, и ожидаем завершения всех этих задач, используя `asyncio.gather`.

К сожалению, если Cloudflare активно блокирует ваши запросы, методы, не предназначенные для асинхронного обхода, не помогут. Вам придется использовать другие методы или решения, возможно, даже вариант с браузерной автоматизацией.
loop.run_in_executor() чтобы запустить код в отдельном потоке, и обернуть этот поток в асинхронный таск.
Похожие вопросы