Блокировка запросов к api при асинхронном парсинге (cloudflare)
Пишу асинхронный парсер. Задача одной из функций - собрать все артикулы товаров (их около 580.000, т.е. запросов предстоит много). Столкнулся с проблемой, что после 400-800 запросов (каждый раз по разному), сервер начинает отдавать ответ с Content-type: application/xml вместо json. Выяснил, что статус-код ответа - 403. Т.е. сервер блокирует меня как бота. Пытался настроить ограничения для запросов используя Throttler и Semaphore. Даже используя их, даже с очень строгими параметрами, через некоторое время появляется та же ошибка. Сразу оговорюсь - доступа к документации api нет. Пример кода:
items_ids = []
queries = 0
async def get_page_data(session, id, page, semaphore, throttler):
url=f"https://shop.deere.com/bff/v1/search?categoryId={id}&page={page}&size=24&productType=all&countryCode=US"
async with throttler:
async with semaphore:
async with session.post(url=url, headers=headers) as response:
try:
data = await response.json()
items_on_page = data.get('products')
for item in items_on_page:
if item.get('assets'):
art = item.get('code')
items_ids.append(art)
queries += 1
print(f"[ASYNC INFO] {id}/{page} articles collected (query: {queries}/{queries_to_do} Content-type: {response.headers.get('Content-Type')})")
except Exception as e:
print(response.text)
async def gather_data():
tasks = []
throttler = Throttler(rate_limit=100, period=15)
semaphore = Semaphore(10)
async with aiohttp.ClientSession() as session:
for id, total_pages in zip(categories_ids, pages_for_query):
for page in range(1, total_pages + 1):
task = asyncio.create_task(get_page_data(session, id, page, semaphore, throttler))
tasks.append(task)
await asyncio.gather(*tasks)
Подскажите, как можно решить эту проблему? Если есть варианты, могу поступиться скоростью выполнения, но идеи иссякли
Ответы (1 шт):
Сервис блокирует т.к не наблюдает поведенческий фактор, ибо ни один пользователь не будет делать сотни однообразных запросов к серверу.
Почему бы просто не купить десятки проксей? Просто переключаясь между ними, когда возвращается статус код 4хх. После прохождение cooldown снова можно будет использовать отстраненные прокси. Увы это единственный способ, да не бесплатный, ну а что поделать.