TimeoutException: Сообщение: время ожидания и веб-страницы не загружаются / не отвечают ChromeDriver Chrome через Python3 - PullRequest
0 голосов
/ 24 января 2019

Когда я запускаю приведенный ниже код, я не могу заставить его работать с threw без какой-либо ошибки тайм-аута, или кажется, что он зависает вечно. По отдельности я могу заставить их работать большую часть времени, но похоже, что только сайт CSI работает стабильно. Могут ли они внести какие-либо изменения, чтобы скрипт работал не только лучше, но и проще? Я что-то пропустил? Я новичок в Python и мог бы помочь мне разобраться с этим.

Спасибо

import csv, os, time
import pandas as pd
import numpy as np

from selenium import webdriver
from pandas import DataFrame, read_csv, set_option
from matplotlib import pyplot
from datetime import date, datetime, timedelta
from collections import Counter
from bs4 import BeautifulSoup
from tqdm import tqdm_notebook #Timer count
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
from googlesearch import search

chrome_options      = webdriver.ChromeOptions()


start = time.time()
sleep_time          = 15

url_csi                 = 'http://www.csidata.com/factsheets.php?type=stock&format=html'
url_tmx                 = 'https://api.tmxmoney.com/en/migreport/search'
url_nyse                = 'https://www.nasdaq.com/screening/company-list.aspx'

database_csi            = "E:\\Stock Database\\Historical Data\\Historical Stock List\\CSI Historical Stock List\\"
database_tmx            = "E:\\Stock Database\\Historical Data\\Historical Stock List\\TMX Historical Stock List\\"
database_nyse           = "E:\\Stock Database\\Historical Data\\Historical Stock List\\NYSE Historical Stock List\\"
database_nasdaq         = "E:\\Stock Database\\Historical Data\\Historical Stock List\\NASDAQ Historical Stock List\\"
database_amex           = "E:\\Stock Database\\Historical Data\\Historical Stock List\\AMEX Historical Stock List\\"

master_file_csi         = "E:\\Stock Database\\Historical Data\\Historical Stock List\\CSI Historical Stock List\\CSI_Ticker_List_Historical.csv"
master_file_tmx         = "E:\\Stock Database\\Historical Data\\Historical Stock List\\TMX Historical Stock List\\TMX_Ticker_List_Historical.xlsx"
master_file_nyse        = "E:\\Stock Database\\Historical Data\\Historical Stock List\\NYSE Historical Stock List\\NYSE_Ticker_List_Historical.csv"
master_file_nasdaq      = "E:\\Stock Database\\Historical Data\\Historical Stock List\\NASDAQ Historical Stock List\\NASDAQ_Ticker_List_Historical.csv"
master_file_amex        = "E:\\Stock Database\\Historical Data\\Historical Stock List\\AMEX Historical Stock List\\AMEX_Ticker_List_Historical.csv"


#CSI Exchange Data Scraping

chrome_options      = webdriver.ChromeOptions()
prefs               = {'download.default_directory': database_csi}
chrome_options.add_experimental_option(name='prefs', value= prefs)
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument('--dns-prefetch-disable')
chrome_driver              = webdriver.Chrome(r"E:\Python Programs\chromedriver", chrome_options = chrome_options)

if os.path.exists(master_file_csi): os.remove(master_file_csi)
#Website
chrome_driver.get(url_csi)
#Navigate Web Page
chrome_driver.find_element_by_css_selector('body > a:nth-child(3)').click()

time.sleep(sleep_time)

chrome_driver.close()

os.rename("%s"%database_csi+"stockfactsheet.csv","%s"%(master_file_csi))

#TMX Exchange Data Scraping
chrome_options      = webdriver.ChromeOptions()
prefs               = {'download.default_directory': database_tmx}
chrome_options.add_experimental_option(name='prefs', value= prefs)
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument('--dns-prefetch-disable')
chrome_driver              = webdriver.Chrome(r"E:\Python Programs\chromedriver", chrome_options = chrome_options)

if os.path.exists(master_file_tmx): os.remove(master_file_tmx)
#Website
chrome_driver.get(url_tmx)
#Navigate Web Page
time.sleep(sleep_time)
chrome_driver.find_element_by_css_selector('#leftside > div.idt_container > form > input[type="submit"]:nth-child(3)').click()
#leftside > div.idt_container > form > input[type="submit"]:nth-child(3)
#Download Data
time.sleep(sleep_time)
chrome_driver.find_element_by_css_selector('#leftside > div.idt_containerResults > div.searchToolBox > div.idtDownload > form > input[type="submit"]:nth-child(8)').click()

time.sleep(sleep_time)

chrome_driver.close()

os.rename("%s"%database_tmx+"mig_report.xlsx","%s"%(master_file_tmx))


#NYSE Exchange Data Scraping
chrome_options      = webdriver.ChromeOptions()
prefs               = {'download.default_directory': database_nyse}
chrome_options.add_experimental_option(name='prefs', value= prefs)
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument('--dns-prefetch-disable')
chrome_driver              = webdriver.Chrome(r"E:\Python Programs\chromedriver", chrome_options = chrome_options)

if os.path.exists(master_file_nyse): os.remove(master_file_nyse)
#Website
#Navigate Web Page
chrome_driver.get(url_nyse)
time.sleep(sleep_time)
chrome_driver.find_element_by_css_selector('#companyListDownloads > table > tbody > tr:nth-child(2) > td:nth-child(2) > a').click()

time.sleep(sleep_time)

chrome_driver.close()

os.rename("%s"%database_nyse+"companylist.csv","%s"%(master_file_nyse))


#NASDAQ Exchange Data Scraping
chrome_options      = webdriver.ChromeOptions()
prefs               = {'download.default_directory': database_nasdaq}
chrome_options.add_experimental_option(name='prefs', value= prefs)
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument('--dns-prefetch-disable')
chrome_driver              = webdriver.Chrome(r"E:\Python Programs\chromedriver", chrome_options = chrome_options)

if os.path.exists(master_file_nasdaq): os.remove(master_file_nasdaq)
#Website
chrome_driver.get(url_nyse)
time.sleep(sleep_time)
#Navigate Web Page
chrome_driver.find_element_by_css_selector('#companyListDownloads > table > tbody > tr:nth-child(1) > td:nth-child(2) > a > div > svg').click()

time.sleep(sleep_time)

chrome_driver.close()

os.rename("%s"%database_nasdaq+"companylist.csv","%s"%(master_file_nasdaq))


#AMEX Exchange Data Scraping
chrome_options      = webdriver.ChromeOptions()
prefs               = {'download.default_directory': database_amex}
chrome_options.add_experimental_option(name='prefs', value= prefs)
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument('--dns-prefetch-disable')
chrome_driver              = webdriver.Chrome(r"E:\Python Programs\chromedriver", chrome_options = chrome_options)

if os.path.exists(master_file_amex): os.remove(master_file_amex)
#Website
chrome_driver.get(url_nyse)
time.sleep(sleep_time)
#Navigate Web Page
chrome_driver.find_element_by_css_selector('#companyListDownloads > table > tbody > tr:nth-child(1) > td:nth-child(2) > a > div > svg').click()

time.sleep(sleep_time)

chrome_driver.close()

os.rename("%s"%database_amex+"companylist.csv","%s"%(master_file_amex))

Error

TimeoutException: Message: timeout
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=2.42.591088 (7b2b2dca23cca0862f674758c9a3933e685c27d5),platform=Windows NT 10.0.17763 x86_64)

После многих попыток я нашел решение. Проблема выглядит, когда страница пытается загрузить. По какой-то причине при запуске из chromedriver загрузка заняла так много времени, и это исправление, похоже, помогло. Это просто останавливает картинки для загрузки.

 prefs = {'download.default_directory': database_csi,'profile.managed_default_content_settings.images': 2}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Если вы можете заставить их работать в большинстве случаев, но только сайт CSI работает стабильно посчитайте себя счастливчиком в этом сообщении об ошибке ...

TimeoutException: Message: timeout
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=2.42.591088 (7b2b2dca23cca0862f674758c9a3933e685c27d5),platform=Windows NT 10.0.17763 x86_64)

... означает, что экземпляр WebDriver timeout при попытке установить связь с сеансом WebBrowsing .

Ваша главная проблема - несовместимость между версиями двоичных файлов, которые вы используете, следующим образом:

  • Вы используете chromedriver = 2,42
  • Примечания к выпуску chromedriver = 2,42 четко упоминает следующее:

Поддержка Chrome v68-70

  • Вы используете хром = 71.0
  • Примечания к выпуску ChromeDriver v2.45 четко упоминает следующее:

Поддержка Chrome v70-72

Таким образом, существует явное несоответствие между ChromeDriver v2.42 и Chrome Browser v71.0

Решение

  • Обновление ChromeDriver до текущей ChromeDriver v2.45 уровень.
  • Keep Chrome версия между Chrome v70-72 уровнями. ( в соответствии с примечаниями к выпуску ChromeDriver v2.45 )
  • Очистка вашего рабочего пространства проекта через IDE и перестройка вашего проекта только с необходимыми зависимостями.
  • Если ваша базовая версия Web Client устарела, удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию Web Клиент .
  • Возьмите Перезагрузка системы .
  • Выполните ваши @Test.
  • Всегда вызывайте driver.quit() в методе tearDown(){} для закрытия и уничтожения экземпляров WebDriver и Web Client изящно.
0 голосов
/ 24 января 2019

Нередко веб-страницы загружаются под управлением selenium / webdriver.Одним из быстрых решений было бы увеличить количество времени, которое программа ожидает при поиске элемента.Кратчайший путь - просто увеличить значение sleep_time.Но это увеличит общее время выполнения сценария.

В моих сценариях селена мне нравится использовать WebDriverWait, импортируя:

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
SELENIUM_TIMEOUT = 10  # define a global timeout (in seconds)

Затем, когда я ищу элемент на странице,код выглядит следующим образом.

try:
    element_is_present = EC.presence_of_element_located((By.ID, 'myCustomElementID'))
    WebDriverWait(driver, SELENIUM_TIMEOUT).until(element_is_present)
    my_element = driver.find_element_by_id('myCustomElementID')
    my_element.click()
except TimeoutException:
    print("Handle the exception here")

Этот код будет проверять наличие элемента на странице с идентификатором = myCustomElementID

Как только это условие будет выполнено, сценарий продолжитсяна.

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