Ошибка тайм-аута с использованием селена в Python, хотя код работает нормально - PullRequest
0 голосов
/ 28 мая 2020

Я здесь новичок и тоже новичок в Python! У меня на диске огромный архив mov ie, я написал код для загрузки плакатов mov ie, используя имена mov ie на моем диске, и поместил плакат в каждую папку mov ie.

from os import listdir
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
import requests

# Loading Film Names
film_names = [f for f in listdir("I:\\Movies")]

# Loading Image Names
image_names = [f for f in listdir("I:\\Movies")]

# Opening Chrome
driver = webdriver.Chrome()
driver.get('http://imdb.com')

counter = 0

for i in film_names[counter:]:
    # filtering movie names to become without director names and no release date
    parantez_num = i.find('(')
    film_names[counter] = i[0:parantez_num - 1]

    print(counter)

    # Typing Film Name in Search Box
    searchbox = driver.find_element_by_xpath('//*[@id="suggestion-search"]')
    searchbox.send_keys(film_names[counter])

    # Clicking Search Button
    searchbutton = driver.find_element_by_xpath('//*[@id="suggestion-search-button"]')
    searchbutton.click()

    # Clicking First Result
    firstsearch = WebDriverWait(driver, 5).until(
    expected_conditions.element_to_be_clickable((By.XPATH, '//* 
    [@id="main"]/div/div[2]/table/tbody/tr[1]/td[2]/a'))
    )
    firstsearch.click()

    # Maximizing Image
    wait = WebDriverWait(driver, 10)
    image_magnify = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, '//* 
    [@id="title-overview-widget'''

    '"]/div[1]/div[3]/div[1]/a/img')))
    image_magnify.click()

    # Saving The Image
    image = WebDriverWait(driver, 5).until(
    expected_conditions.element_to_be_clickable((By.XPATH, '//*[@id="photo- 
    container"]/div/div[3]/div/div[2]/div['
                                                           '1]/div[2]/div/img[2]'))
    )
    image_url = (image.get_attribute('src'))
    with open("I:\\Movies\\" + image_names[counter] + "\\" + image_names[counter] + ".jpg", "wb") as 
    f:
    f.write(requests.get(image_url).content)

    # going back to the first page of IMDB
    driver.back()
    driver.back()
    driver.back()

    counter += 1

Работает нормально. Но после случайного количества успешных загрузок он внезапно останавливается и выдает ошибку:

Traceback (most recent call last):
File "C:/Users/Kurdman/Desktop/Poster Downloader/Main/MainCode.py", line 42, in <module>
image_magnifier = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, '//*[@id="title- 
overview-widget'
File "C:\Users\Kurdman\Desktop\Poster Downloader\Main\venv\lib\site- 
packages\selenium\webdriver\support\wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

Интересно, почему я получаю эту ошибку, потому что «for l oop» отлично работает для 10 фильмов, потом внезапно прекращается. Даже если я установил счетчик примерно на 100, чтобы начать со 100-го mov ie, он работает для некоторых из них, а затем снова останавливается и выдает эту ошибку.

Кстати, мой mov ie имена в таком формате: Ajami (2009) - Scandar Copti - Foreign Language Oscar Nominee поэтому я фильтрую имена, чтобы удалить дату выпуска, имена режиссеров и другие вещи, найдя индекс первой круглой скобки в заголовке.

1 Ответ

2 голосов
/ 28 мая 2020

Да, есть вероятность получить TimeOutError, когда элемент загружается дольше ожидаемого времени, вы также можете справиться с этой ошибкой, просто слегка изменив значение для l oop. попробуйте использовать приведенный ниже код для i в film_names [counter:]:

try:
    parantez_num = i.find('(')
    film_names[counter] = i[0:parantez_num - 1]

    print(counter)

    # Typing Film Name in Search Box
    searchbox = driver.find_element_by_xpath('//*[@id="suggestion-search"]')
    searchbox.send_keys(film_names[counter])

    # Clicking Search Button
    searchbutton = driver.find_element_by_xpath('//*[@id="suggestion-search-button"]')
    searchbutton.click()

    # Clicking First Result
    firstsearch = WebDriverWait(driver, 5).until(
        expected_conditions.element_to_be_clickable((By.XPATH, '//*
        [ @ id="main"] / div / div[2] / table / tbody / tr[1] / td[2] / a'))
                                                     )
    firstsearch.click()

    # Maximizing Image
    wait = WebDriverWait(driver, 10)
    image_magnify = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, '//*
    [ @ id="title-overview-widget'''

                                                                            '"]/div[1]/div[3]/div[1]/a/img')))
    image_magnify.click()

    # Saving The Image
    image = WebDriverWait(driver, 5).until(
        expected_conditions.element_to_be_clickable((By.XPATH, '//*[@id="photo-
                                                     container"]/div/div[3]/div/div[2]/div['
                                                     '1]/div[2]/div/img[2]'))
    )
    image_url = (image.get_attribute('src'))
    with open("I:\\Movies\\" + image_names[counter] + "\\" + image_names[counter] + ".jpg", "wb") as
    f:
        f.write(requests.get(image_url).content)

    # going back to the first page of IMDB
    driver.back()
    driver.back()
    driver.back()

    counter += 1
except TimeoutError:
    counter += 0

просто попробуйте отредактировать для l oop, это обработает эту ошибку, если она появится снова

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