Задать вопрос
@mermyly

Парсер получает ответ 403, как исправить?

В общем, код на aiohttp получает 403 ответ, я так понимаю блокировка cloudflare, но почему-то синхронный код на reqeusts получает 200 ответ, не понимаю с чем это связано. Использую базу юзерагентов + базу прокси. сайт https://vseinstrumenti.ru

import asyncio
import aiohttp
from bs4 import BeautifulSoup
import random

with open('urllist.txt', 'r') as urlfile:
    urls = [line.strip() for line in urlfile]

with open('proxies.txt', 'r') as prx_file:
    proxies = [line.strip() for line in prx_file.readlines()]

with open('useragents.txt', 'r') as agents:
    user_agents = [line.strip() for line in agents.readlines()]


def get_user():
    useragent = random.choice(user_agents)
    return {'User-Agent': useragent}


def get_proxy():
    proxy = random.choice(proxies)
    return f'http://{proxy}'


async def get_data(session, url):
    async with session.get(url, headers=get_user(), proxy=get_proxy()) as response:
        response_text = await response.text()
        soup = BeautifulSoup(response_text, 'lxml')
        try:
            sku = soup.find('div', class_='kZIDtu')  # артикул
            print(f'Артикул >>> {sku.span.get_text()}')
        except:
            print(response_text)


async def get_tasks():
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            task = asyncio.create_task(get_data(session, url))
            tasks.append(task)
        await asyncio.gather(*tasks)


asyncio.run(get_tasks())


upd: добавил tcpconnector(ssl=false) и иногда начали проходить 200 респонсы, но почему то без использования прокси, если я использую прокси == 403, если нет == 200, но не на всех запросах
  • Вопрос задан
  • 327 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
Просто не надо долбить целевой сервер большим количеством одновременных запросов.
Проверять в заголовке "Retry-After" и повторять попытку позже когда сервер слишком занят.
Можно использовать asyncio.Semaphore для ограничения одновременного кол-ва запросов.
Ответ написан
Ваш ответ на вопрос

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

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