Ускорение/оптимизация парсера

Есть сайт https://stroit-kompanii.ru/ С помощью bs4 и requests, lxml написал для него парсер, который собирает информацию со страничек компаний в csv. Делает он это путем создания ссылок на эти компании, проходя по каждой специализации и по каждому городу. И прежде чем перейти в следующий раздел специализации, он записывает это в файл. Так вот, на сайте указано что компаний 394550 шт. По моим подсчетам парсеру нужно будет больше одного дня что бы спарсить все страницы с сайта. Есть ли способ как его ускорить/оптимизировать или же куда копать что бы сделать более быстрый парсер??

Я конечно мог бы ждать, но через определенное время от получаса до часа вываливается ошибка TimeoutError: [WinError 10060] которую я так же не знаю как обрабатывать правильно. Допустим я даже если найду как ее обработать каков шанс что через 12 часов не вывалится еще одна ошибка формы или еще чего либо, поэтому более рационально считаю сделать вообще другой скрипт или же оптимизировать этот.

Реально ли сделать скрипт который делает тоже самое ну скажем за пару часов? Если нет, то подскажите как обойти эту ошибку, выходит рандомно, последний раз вылезла после записи 5563 компаний.

Код парсера (две функции которые делают "суп" и обрабатвыют инфу с карточки компании не стал включать):

with open('res.csv', 'w', encoding='utf-8-sig', newline='') as file:
    writer = csv.writer(file, delimiter=';')
    writer.writerow(['Организация', 'Город', 'Адрес', 'Контактные данные', 'Виды деятельности'])

count = 0
shema = 'https://stroit-kompanii.ru/'
url = 'https://stroit-kompanii.ru/'
soup = make_soup(url)
# создаем ссылки на организации
all_cat_list = [shema + link['href'] for link in soup.find('div', class_='all_cat_list').find_all('a')]

# создаем ссылки на список гороодов по организации
for link in all_cat_list:
    soup = make_soup(link)
    cities = [link + i['href'] for i in soup.find('div', class_='section_city_a').find_all('a')]

    # создаем ссылки на список компаний по всем городам
    companies = []
    for link in cities:
        soup = make_soup(link)
        if soup.find('div', class_='smal_desc_company'):
            for i in soup.find_all('div', class_='smal_desc_company'):
                companies.append(shema + i.find('a')['href'])
        print(f'Создано {len(companies)} ссылок компаний')

    # проходим по каждой компании и заливаем в результат
    for link in companies:
        response = requests.get(url=link)
        print(link)
        response.encoding = 'cp1251'
        soup = BeautifulSoup(response.text, 'lxml')
        res = company_info(soup, link)
        count += 1

        flatten = res['org'], res['city'], res['street'], res['contact'], res['activities'],

        with open('res.csv', 'a', encoding='utf-8-sig', newline='') as file:
            writer = csv.writer(file, delimiter=';')
            writer.writerow(flatten)
            print(f'writed {count} compnies')

Ответы (0 шт):