python - продолжить цикл, если эта итерация занимает слишком много времени - PullRequest
0 голосов
/ 12 июня 2018

У меня проблема с PhantomJS, который может зависать в цикле без сообщения об ошибке.Я знаю, что мой код хорош, потому что после перезапуска он обычно завершается и, возможно, зависает где-то позже.Я имею в виду, может быть, что-то вроде этого:

i = 0
while i < len(url_list):
    try:
        driver.get(url_list[i])
        # do whatever needs to be done
        i = i+1
        # go on the next one
    except ThisIterationTakesTooLong:
        # try again for this one because the code is definitely good
        continue

Возможно ли сделать что-то подобное?По сути, это вещь в фоновом режиме, которая проверяет, как долго работает цикл.Я знаю о time.time (), но проблема в том, что он даже не будет измерять, если зависнет на команде перед счетчиком.

EDIT Посмотрев на предложенный вопрос, у меня все еще есть проблема, потому что этот сигнальный модуль не работает должным образом.

import signal
signal.alarm(5)

Выдает «AttributeError: у объекта 'module' нет атрибута 'alarm'"Похоже, я не могу этим пользоваться.

1 Ответ

0 голосов
/ 12 июня 2018

Я сталкивался с подобными вещами раньше, и, к сожалению, нет никакого способа обойти это.Дело в том, что иногда страницы / элементы просто не загружаются, и вы должны сделать выбор.Обычно я делаю что-то вроде этого:

from selenium.common.exceptions import TimeoutException

# How long to wait for page before timeout
driver.set_page_load_timeout(10)

def wait_for_url(driver, url, max_attempts):
    """Make multiple attempts to load page
    according to page load timeout, and
    max_attempts."""

    attempts = 0

    while attempts < max_attempts:

        try:
            driver.get(url)
            return True

        except TimeoutException:
            # Prepare for another attempt
            attempts += 1

            if attempts == 10:
                # Bail on max_attempts
                return False

# We'll use this if we find any urls that won't load
# so we can process later. 
revisit = []

for url in url_list:

    # Make 10 attempts before giving up.
    url_is_loaded = wait_for_url(driver, url, 10)

    if url_is_loaded:
        # Do whatever

    else:
        revisit.append(url)

# Now we can try to process those unvisitied URLs. 

Я бы также добавил, что проблема может быть в PhantomJS.Самые последние версии селена осуждают его.По моему опыту, PhantomJS вял и склонен к неожиданному поведению.Если вам нужен безголовый, вы можете использовать очень стабильный Chrome.Если вы не знакомы, это выглядит так:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")

driver = webdriver.Chrome(path/to/chromedriver, chrome_options=chrome_options)

Возможно, вам поможет одно из этих предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...