Как решить проблему "Fatal Python error: Cannot recover from stack overflow." при парсинге с помощью selenium?

Согласно задаче, мне нужно проанализировать все книги (пройти по всем категориям и перейти к каждому товару, для того что бы получить isbn). На сайте представлено около 100 тысяч книг. Но при выполнении скрипта через некоторое время возникает ошибка: "Fatal Python error: Cannot recover from stack overflow.". Я понимаю, что, скорее всего, не хватает оперативной памяти (судя по подобным вопросам, найденным в Интернете), но как это обойти, мне пока не ясно. Вот как выглядит мой код:

import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as bs
from mongodb import connect_mongo_bd
import time


db = connect_mongo_bd()
collections = db.comparison_new

print('Start!')

headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'}
service = Service('/home/Test/Desktop/work/python_parser/chromedriver')
options = webdriver.ChromeOptions()
options.headless = True
options.binary_location = '/data/opt/apps/cn.google.chrome/files/google-chrome'
browser = webdriver.Chrome(service=service, options=options)


def pagination_cycle(url):

    print(url)

    try:
        browser.get(url)

        wait = WebDriverWait(browser, 10)
        wait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'product'))
        )

        first_soup = bs(browser.page_source, 'html.parser')

        products = first_soup.select('#resProd > div.product')

        products_list = []
        for product in products:

            time.sleep(1)

            product_link_tag = product.select_one('div.rtd > div.title-mine > a')
            if not product_link_tag:
                continue
            else:
                product_link = 'https://test.de' + product_link_tag['href']

            print(product_link)

            second_request = requests.get(product_link, headers=headers)

            if second_request.status_code == 200:

                second_soup = bs(second_request.content, 'html.parser')

                product_name_tag = product.select_one('div.rtd > div.title-mine > a')
                if product_name_tag:
                    product_name = product_name_tag.text
                else:
                    continue

                product_price_tag = second_soup.select_one('#product_shop > div.product_list_style > div.item-info > div > span.price2')
                if product_price_tag:
                    product_price = float(product_price_tag.text.replace(' €', ''))
                else:
                    continue

                product_isbn_tag = second_soup.select_one('#product_shop > div.product_list_style > div.item-info').find(
                    text='ISBN'
                )
                if product_isbn_tag:
                    product_isbn = product_isbn_tag.find_parent().find_next_sibling().text.replace('-', '')
                else:
                    continue

                collections.update_one(
                    {
                        'isbn': product_isbn
                    },
                    {
                        '$set': {
                            'name': product_name,
                            'test_price': product_price
                        },
                        '$inc': {
                            'cnt_updated': 1
                        }
                    },
                    upsert=True
                )

        next_link = first_soup.select_one(
            '#resPage > div.pager > div > div.pages > ol > li.current'
        ).find_next_sibling().find('a')

        if next_link:
            pagination_cycle('https://test.de/knigi/' + next_link['href'])

    except Exception as ex:
        print("Ошибка: " + ex.__class__.__name__)
        time.sleep(10)
        pagination_cycle(url)

    return True


result = pagination_cycle('https://test.de/knigi/')
print(result)

browser.quit()
db.close()

И все было бы хорошо, но через некоторое время я постоянно получаю эту ошибку: Error screen in the console

Подскажите пожалуйста, как решить эту проблему ? Уже несколько дней сижу над этим


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