Selenium Code работает локально, но не на PythonAnywhere

У меня есть веб-скрейпер, который работает в моей системе, и я хотел перенести его на PythonAnywhere, но когда я переместил его сейчас, он не работает.

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

Мой код:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import csv
import time



# Lists for functions
parcel_link =[]
token = []
csv_output = [ ]

# main scraping function
def getLinks(link):


# Open web browser and get url - 3 second time delay.

#Open web browser and get url - 3 second time delay.
driver.get(link)
time.sleep(3)

inputElement = driver.find_element_by_id("mSearchControl_mParcelID")
inputElement.send_keys(parcel_code+"*/n")
print("ENTER hit")

pageSource = driver.page_source
bsObj = BeautifulSoup(pageSource)
parcel_link.clear()
print(bsObj)
#pause = WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.ID, "mResultscontrol_mGrid_RealDataGrid")))

for link in bsObj.find(id="mResultscontrol_mGrid_RealDataGrid").findAll('a'):
    parcel_link.append(link.text)
print(parcel_link)

for test in parcel_link:
    clickable = driver.find_element_by_link_text(test)
    clickable.click()
    time.sleep(2)

Ссылка, которую я пытаюсь использовать: https://ascendweb.jacksongov.org/ascend/%280yzb2gusuzb0kyvjwniv3255%29/search.aspx

и я пытаюсь отправить: 15-100*

Проследить:

03:12 ~/Tax_Scrape $ xvfb-run python3.4 Jackson_Parcel_script.py
Traceback (most recent call last):
  File "Jackson_Parcel_script.py", line 377, in <module>
    getLinks("https://ascendweb.jacksongov.org/ascend/%28biohwjq5iibvvkisd1kjmm45%29/result.aspx")
  File "Jackson_Parcel_script.py", line 29, in getLinks
    inputElement = driver.find_element_by_id("mSearchControl_mParcelID")
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 206, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 662, in find_element
    {'using': by, 'value': value})['value']
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 173, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/errorhandler.py", line 164, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"id","selector":"mSearchControl_mParcelID"}' ; Stac
ktrace: 
    at FirefoxDriver.findElementInternal_ (file:///tmp/tmpiuuqg3m7/extensions/[email protected]/components/driver_component.js:9470)
    at FirefoxDriver.findElement (file:///tmp/tmpiuuqg3m7/extensions/[email protected]/components/driver_component.js:9479)
    at DelayedCommand.executeInternal_/h (file:///tmp/tmpiuuqg3m7/extensions/[email protected]/components/command_processor.js:11455)
    at DelayedCommand.executeInternal_ (file:///tmp/tmpiuuqg3m7/extensions/[email protected]/components/command_processor.js:11460)
    at DelayedCommand.execute/< (file:///tmp/tmpiuuqg3m7/extensions/[email protected]/components/command_processor.js:11402) 
03:13 ~/Tax_Scrape $ 

Инициация Селена:

for retry in range(3):
    try:
        driver = webdriver.Firefox()
        break
    except:
        time.sleep(3)

for parcel_code in token:
    getLinks("https://ascendweb.jacksongov.org/ascend/%28biohwjq5iibvvkisd1kjmm4 5%29/result.aspx")

PythonAnywhere использует виртуальный экземпляр FireFox, который должен быть безголовым, как JSPhantom, поэтому у меня нет номера версии.

Любая помощь будет отличной

RS


person Raymond    schedule 05.12.2015    source источник


Ответы (1)


Ну, возможно, браузер, используемый на PythonAnywhere, недостаточно быстро загружает сайт. Поэтому вместо time.sleep(3) попробуйте неявное ожидание элемента.

Неявное ожидание — это указание WebDriver опрашивать DOM в течение определенного времени при попытке найти элемент или элементы, если они не доступны немедленно. Значение по умолчанию — 0. После установки неявное ожидание устанавливается на время существования экземпляра объекта WebDriver.

Использование time.sleep() с Selenium вообще не очень хорошая идея.

И дайте ему больше, чем просто 3 секунды, с помощью implicitly_wait() вы указываете максимальное время, затрачиваемое на ожидание элемента.
Таким образом, если вы установите implicitly_wait(10) и страница загрузится, например, через 5 секунд, то Selenium будет ждать только 5 секунд.

driver.implicitly_wait(10)
person Dušan Maďar    schedule 05.12.2015