[Python] undetected_chromedriver error: Too many open files

Discussão em 'Python' iniciado por Stack, Maio 23, 2025.

  1. Stack

    Stack Membro Participativo

    I am running this selenium-script. After 10 hours I see an error


    Too many open files
    ​

    My code:

    logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
    logging.FileHandler("my_parser.log"),
    logging.StreamHandler()
    ]
    )
    logger = logging.getLogger('ParserLogger')

    def get_random_chrome_user_agent():
    user_agent = UserAgent(browsers='chrome', os='windows', platforms='pc')
    return user_agent.random


    def get_chromedriver(proxy_data: dict, USE_GUI=False):
    chrome_options = uc.ChromeOptions()
    if not USE_GUI:
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--start-maximized')
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')
    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")

    manifest_json = """
    {
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
    "proxy",
    "tabs",
    "unlimitedStorage",
    "storage",
    "<all_urls>",
    "webRequest",
    "webRequestBlocking"
    ],
    "background": {
    "scripts": ["background.js"]
    },
    "minimum_chrome_version":"22.0.0"
    }
    """

    background_js = """
    var config = {
    mode: "fixed_servers",
    rules: {
    singleProxy: {
    scheme: "http",
    host: "%s",
    port: parseInt(%s)
    },
    bypassList: ["localhost"]
    }
    };

    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

    function callbackFn(details) {
    return {
    authCredentials: {
    username: "%s",
    password: "%s"
    }
    };
    }

    chrome.webRequest.onAuthRequired.addListener(
    callbackFn,
    {urls: ["<all_urls>"]},
    ['blocking']
    );
    """ % (proxy_data["proxy"], proxy_data["proxy_port"], proxy_data["proxy_login"], proxy_data["proxy_password"])
    if proxy_data:
    pluginfile = 'proxy_auth_plugin.zip'

    with zipfile.ZipFile(pluginfile, 'w') as zp:
    zp.writestr("manifest.json", manifest_json)
    zp.writestr("background.js", background_js)
    zp.close()
    chrome_options.add_extension(pluginfile)

    driver = uc.Chrome(chrome_options=chrome_options)

    # Apply stealth mode for Russian Linux user
    stealth(driver,
    languages=["ru-RU", "ru", "en-US", "en"],
    vendor="Google Inc.",
    platform="Linux x86_64",
    webgl_vendor="Intel Inc.",
    renderer="Intel Open Source Technology Center Mesa DRI Intel(R) UHD Graphics 620 (KBL GT2)",
    fix_hairline=True,
    )

    return driver


    class YandexParser():
    def __init__(self, proxy_data, USE_GUI=False, SAVE_SCRIN=False):
    # Use native headless mode for Chrome
    print(f"USE_GUI={USE_GUI} SAVE_SCRIN={SAVE_SCRIN}")
    self.SAVE_SCRIN = SAVE_SCRIN
    self.proxy_data = proxy_data
    self.USE_GUI = USE_GUI
    self.driver = None
    self.display = None
    self._initialize_driver()

    def _initialize_driver(self):
    if platform.system() == 'Darwin': # macOS
    self.chrome_options = uc.ChromeOptions()
    self.chrome_options.add_argument('--headless=new')
    self.chrome_options.add_argument('--disable-gpu')
    self.chrome_options.add_argument('--no-sandbox')
    self.chrome_options.add_argument('--disable-dev-shm-usage')
    self.driver = get_chromedriver(proxy_data=self.proxy_data, USE_GUI=self.USE_GUI)
    else: # Linux
    from pyvirtualdisplay import Display
    self.display = Display(visible=0, size=(800, 600))
    self.display.start()
    self.driver = get_chromedriver(proxy_data=self.proxy_data, USE_GUI=self.USE_GUI)

    self.driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
    Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
    '''
    })
    self.driver.get("https://ya.ru/")
    time.sleep(random.uniform(1.5, 3.5))

    def __enter__(self):
    return self

    def __exit__(self, exc_type, exc_val, exc_tb):
    self.close()

    def close(self):
    try:
    if self.driver:
    self.driver.quit()
    self.driver = None
    except Exception as e:
    logger.error(f"Error closing driver: {e}")

    try:
    if self.display:
    self.display.stop()
    self.display = None
    except Exception as e:
    logger.error(f"Error stopping display: {e}")

    def check_captcha(self):
    """ Try to overcome isBot button"""
    cur_time = str(datetime.now()).replace(' ', '_')
    if "showcaptcha" in self.driver.current_url:
    logger.info("Captcha found")
    if self.SAVE_SCRIN:
    self.driver.save_screenshot(f'screens/img_captcha_{cur_time}.png')

    raw_button = self.driver.find_elements(By.XPATH, "//input[@class='CheckboxCaptcha-Button']")
    if raw_button:
    raw_button[0].click()
    logger.info("Button clicked")
    time.sleep(15)
    if self.SAVE_SCRIN:
    self.driver.save_screenshot(f'screens/img_captcha_afterclick_{cur_time}.png')
    elif self.SAVE_SCRIN:
    self.driver.save_screenshot(f'screens/img_{cur_time}.png')


    def parse(self, film_name: str):
    logger.info(f"Start parse {film_name}")
    result_urls = []
    try:
    self.driver.get(f"https://ya.ru/search/?text={film_name}&lr=213&search_source=yaru_desktop_common&search_domain=yaru")
    self.check_captcha()
    for i in range(1, 5):
    result_urls.extend(self.parse_page(page_id=i))
    self.get_next_page()
    self.check_captcha()
    # Human-like random delay
    time.sleep(random.uniform(2, 5))
    except Exception:
    logger.error(f"Exception in {traceback.format_exc()}")
    finally:
    logger.info(f"Found {len(result_urls)} for film {film_name}: {result_urls}")

    def parse_page(self, page_id):
    res = []
    urls_raw = self.driver.find_elements(By.XPATH, value='//a[@class="Link Link_theme_normal OrganicTitle-Link organic__url link"]')
    for url_raw in urls_raw:
    href = url_raw.get_attribute("href")
    if href and "yabs.yandex.ru" not in href:
    res.append(href)
    logger.info(f"Found {len(res)} urls on page {page_id}")
    return res

    def get_next_page(self):
    next_link_raw = self.driver.find_elements(By.XPATH, '//div[@class="Pager-ListItem Pager-ListItem_type_next"]')
    if next_link_raw:
    next_link_raw[0].click()
    # Human-like random delay
    time.sleep(random.uniform(3, 6))


    if __name__ == "__main__":
    proxies = [
    # Proxy datya
    ]
    films = ["Терминатор смотреть", "Саша Таня смотреть", "Джон Уик смотреть онлайн"]
    idx = 0
    while True:
    try:
    with YandexParser(USE_GUI=False, proxy_data=proxies[idx % 2]) as parser:
    film = films[idx]
    idx = (idx + 1) % len(films)
    parser.parse(film)

    time.sleep(random.uniform(8, 15))
    except Exception as e:
    logger.error(f"Exception {traceback.format_exc()}")
    time.sleep(1) # Add delay after error to prevent rapid retries


    Full trace:

    [ERROR] Exception Traceback (most recent call last):
    File "/home/myuser/yandex-urls-fetcher/03_selenium_stels.py", line 259, in <module>
    with YandexParser(USE_GUI=False, proxy_data=proxies[idx % 2]) as parser:
    File "/home/myuser/yandex-urls-fetcher/03_selenium_stels.py", line 139, in __init__
    self._initialize_driver()
    File "/home/myuser/yandex-urls-fetcher/03_selenium_stels.py", line 151, in _initialize_driver
    self.display = Display(visible=0, size=(800, 600))
    File "/home/myuser/yandex-urls-fetcher/venv/lib/python3.9/site-packages/pyvirtualdisplay/display.py", line 54, in __init__
    self._obj = cls(
    File "/home/myuser/yandex-urls-fetcher/venv/lib/python3.9/site-packages/pyvirtualdisplay/xvfb.py", line 44, in __init__
    AbstractDisplay.__init__(
    File "/home/myuser/yandex-urls-fetcher/venv/lib/python3.9/site-packages/pyvirtualdisplay/abstractdisplay.py", line 85, in __init__
    helptext = get_helptext(program)
    File "/home/myuser/yandex-urls-fetcher/venv/lib/python3.9/site-packages/pyvirtualdisplay/util.py", line 13, in get_helptext
    p = subprocess.Popen(
    File "/usr/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
    File "/usr/lib/python3.9/subprocess.py", line 1722, in _execute_child
    errpipe_read, errpipe_write = os.pipe()
    OSError: [Errno 24] Too many open files

    Continue reading...

Compartilhe esta Página