Нажмите на ссылку для загрузки с Python и Selenium Firefox Webdriver - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь последовательно загружать исторические данные о запасах по ссылке, которая появляется на странице после наведения курсора на нее.В настоящее время у меня есть следующий код, который, по-видимому, не находит css_selector и не загружает файл .csv.

#!/usr/bin/env python3.6

## Import Libraries
import os, sys
import time

from selenium import webdriver
import selenium.webdriver.firefox.options
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC 

## Declare Variables
ticker = 'CAT'
period1 = '1262332800'
period2 = '1537945200'
download_path = os.getcwd()
css_selector = "a.Fl\(end\):nth-child(1)"

## Configure Firefox Options
profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.folderList", 2) # 0 means to download to the desktop, 1 means to download to the default "Downloads" directory, 2 means to use the directory 
profile.set_preference("browser.download.dir", download_path)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip/text/csv")

## Firefox driver loads historical data page
driver = webdriver.Firefox(firefox_profile=profile)
driver.get("https://finance.yahoo.com/quote/{}/history?period1={}&period2={}&interval=1d&filter=history&frequency=1d"
           .format(ticker, period1, period2))

## Click on 'Download Data' Link
try:
    input_element = driver.find_element_by_css_selector(css_selector).click()
    print('Success!')

except:
    print('Failed!!!!!')

finally:
    driver.quit()
    print('Kill Driver!')

Пример сайта: https://finance.yahoo.com/quote/CAT/history?period1=1262332800&period2=1538118000&interval=1d&filter=history&frequency=1d

css_selector, "a.Fl (конец): nth-child (1) ", находится в этом разделе HTML:

<svg class="Va(m)! Mend(5px) Stk($c-fuji-blue-1-b)! Fill($c-fuji-blue-1-b)! Cur(p)" width="15" height="15" viewBox="0 0 48 48" data-icon="download" style="fill: rgb(0, 129, 242); stroke: rgb(0, 129, 242); stroke-width: 0; vertical-align: bottom;"><path d="M43.002 43.002h-38c-1.106 0-2.002-.896-2.002-2v-11c0-1.105.896-2 2.002-2 1.103 0 1.998.895 1.998 2v9h34.002v-9c0-1.105.896-2 2-2s2 .895 2 2v11c0 1.103-.896 2-2 2m-19-8L11.57 23.307c-.75-.748-.75-1.965 0-2.715.75-.75 1.965-.75 2.715 0l7.717 7.716V2h4v26.308l7.717-7.716c.75-.75 1.964-.75 2.714 0s.75 1.967 0 2.715L24.002 35.002z"></path></svg><span>Download Data</span>

Мои вопросы:

  • Есть ли более простой способнажать на ссылку?XPath?partial_link?
  • Я пытаюсь нажать на правильный css_selector?
  • Нужно ли наводить курсор на текст, чтобы щелкнуть ссылку для загрузки данных?
  • Как найти элемент во время загрузки сайта?Сайт никогда не заканчивает загрузку, есть непрерывные звонки на рекламные серверы.

Использование метода .find_element_by_link_text () приводит к TimeoutException:

TimeoutException Traceback (самый последний звонок последний)in ()
21 ## Перейти на домашнюю страницу для исторических данных
22 driver.get ("https://finance.yahoo.com/quote/{}/history?period1={}&period2={}&interval=1d&filter=history&frequency=1d"

---> 23 .формат (тикер, period1, period2))
24
25 print ('. Get () Complete!')

~ / virtualenvs / demo / lib / python3.6 / site-packages / selenium / webdriver / remote / webdriver.py в get(self, url)
331 Загружает веб-страницу в текущем сеансе браузера.
332 "" "
-> 333 self.execute (Command.GET, {'url': url})
334
335 @property ~ / virtualenvs / demo / lib / python3.6 / site-packages / selenium / webdriver / remote / webdriver.py в execute (self, driver_command, params)
319 response = self.command_executor.execute (driver_command, params)
320, если ответ:
-> 321 self.error_handler.check_response (response)
322 ответ ['значение '] = self._unwrap_value (
323 response.get (' value ', None))

~ / virtualenvs / demo / lib / python3.6 / site-packages / selenium / webdriver / remote/errorhandler.py в check_response (self, response)
240 alert_text = value ['alert']. get ('text')
241 повысить исключительный класс (сообщение, экран, отслеживание стека, alert_text)
-> 242 повысить исключение_класса (сообщение, экран, трассировка стека)
243
244 def _value_or_default (self, obj, key, default):

TimeoutException: Сообщение: время загрузки страницы после 300000 мс

Моя интерпретация заключается в том, что сайт не завершает загрузку, поэтому логика try / исключением / finally никогда не выполняется.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Можете ли вы попробовать ниже варианты

 1. download = driver.find_element_by_xpath(".//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[2]/span[2]/a")
    download.click()
 2. download = driver.find_element_by_link_text('Download Data')
    download.click()
 3. download = driver.find_element_by_partial_link_text('Download')
    download.click()
0 голосов
/ 03 октября 2018
  • Есть ли более простой способ нажать на ссылку?

    выбор по тексту ссылки должен работать нормально:

    driver.find_element_by_link_text('Download Data').click()
    
  • Пытаюсь ли я нажать на правильный css_selector?

    да, селектор кажется правильным

  • DoМне нужно навести курсор на текст, чтобы щелкнуть ссылку для загрузки данных?

    нет, вам не нужно наводить курсор на ссылку

Обновление

Если вам нужно остановить загрузку страницы, попробуйте следующее решение:

from selenium.common.exceptions import TimeoutException

driver.set_page_load_timeout(10)
try:
    driver.get("https://finance.yahoo.com/quote/{}/history?period1={}&period2={}&interval=1d&filter=history&frequency=1d"
           .format(ticker, period1, period2))
except TimeoutException:
    driver.execute_script("window.stop();")
driver.find_element_by_link_text('Download Data').click()

Загрузка страницы будет принудительно остановлена, если не будет загружена в течение 10 секунд

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