Почему сайт отклоняет запросы?

Пытаюсь спарсить с сайта email адрес нужной кампании, сначала всё работает хорошо, но черех некоторе время выдает ошибку
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='vbankcenter.ru', port=443): Max retries exceeded with url: /contragent/search?searchStr=%D0%9E%D0%9E%D0%9E%20%D0%9C%D0%BE%D1%80%D1%81%D0%BA%D0%B0%D1%8F%20%D0%90%D0%B3%D0%B5%D0%BD%D1%82%D1%81%D0%BA%D0%B0%D1%8F%20%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x000001B82A48C040>: Failed to establish a new connection: [WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера'))

Пробовал поставить задержки, закрывать запрос, не помогло
на вход фунцкия принимает список из названия и адреса компании
Код функции

import requests
from bs4 import BeautifulSoup
from time import sleep
def mails(req):
    response = requests.get('https://vbankcenter.ru/contragent/search?searchStr=' + req[0], timeout=5)
    sleep(1)
    get_html = response.text
    response.close()
    soup = BeautifulSoup(get_html, 'html.parser')
    cards = soup.find_all('article')
    flag = False
    for card in cards:
        if card.find('p', class_="whitespace-pre-wrap mb-0").find('span').string[:-1] == req[1].split(',')[0]:
            url = 'https://vbankcenter.ru' + card.contents[0].find('a')['href']
            response_2 = requests.get(url, timeout=5)
            parse_mails = response_2.text
            response_2.close()
            soup = BeautifulSoup(parse_mails, 'html.parser')
            try:
                soup = soup.find_all('div', class_="flex items-baseline mt-1")[1].find('a').string
                print(soup)
                sleep(0.5)
                return [soup]
            except:
                sleep(0.5)
                return []

    if flag == False:
        sleep(0.5)
        return []

mails = mails(['ООО ПРОИЗВОДСТВЕННОМУ ПРЕДПРИЯТИЮ НЭЙЧЕ','353993, Россия, край. Краснодарский, г. Новороссийск, ул. ФИЗКУЛЬТУРНАЯ, д. 46'])

  • Вопрос задан
  • 404 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
У тебя - задержка 0.5 секунды. Поставь формулу exponential backoff. Тоесть следующая задержка
в случае неудачи будет 1 секунда. Потом 2, 4, 8 e.t.c. До тех пор пока HTTP код c 429 не перейдет
в статус 200(201)
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
сначала всё работает хорошо, но черех некоторе время выдает ошибку

Как ни странно, сайт подозревает, что твой бот-парсер - это бот-парсер.
Задержки, которые у тебя прописаны внутри скрипта, никакого значения не имеют. К этому моменту данные уже получены с сайта, и с ним ты больше не взаимодействуешь. Имеет значение интервал между повторными вызовами requests.get(). У тебя в скрипте вызов не повторный, но ты же сам скрипт неоднократно дёргаешь, я так понял?
Ответ написан
Ваш ответ на вопрос

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

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