Войдите в систему и очистите без Селена

#selenium #authentication #scrape #python-requests-html

Вопрос:

Я пытаюсь отслеживать различные инвестиции, которые я держу, через единую базу данных (mysql с интерфейсом MS Access). У меня есть решение для большинства из них, поскольку я могу получить цену за единицу / цену акции без необходимости входа на портал. Моя проблема в том, что для одной из моих инвестиций я могу узнать стоимость, только войдя в систему.

У меня это работает через мой ноутбук с использованием селена, но мой raspberry pi выполняет всю уборку, а селен на нем не работает и продолжает ломаться, когда я делаю обновления и т. Д.

Я надеюсь, что кто-нибудь сможет подсказать мне, какой модуль python использовать для выполнения того же самого без селена. Для другой моей работы я использую сочетание requests_html и urllib.request, поэтому я предпочитаю их, но не смог с этим разобраться. Также пытались механизировать, но безуспешно.

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

 from selenium import webdriver
import time

browser = webdriver.Edge(r"C:Pythonedgedrivermsedgedriver.exe")
browser.get('https://app.raizinvest.com.au/login')

time.sleep(4)  
browser.find_element_by_name("email").send_keys("testaccountraiz@yahoo.com")
browser.find_element_by_name("password").send_keys("Test4321")
browser.find_element_by_xpath("/html/body/div/div/div[1]/div/div/div/form/div[4]/button").click()
time.sleep(3)
print(str(browser.find_elements_by_class_name("page-content__banner-account-value")[0].text))
browser.close()
 

Ответ №1:

Ваш код селена продолжает нарушаться, потому что вы используете xpath вот так

/html/body/div/div/div[1]/div/div/div/form/div[4]/button

вы даже можете ввести explicit waits в свой код, чтобы повысить надежность.

Гелий-один из таких инструментов, который немного продвинут по сравнению с селеном, но имеет свои собственные ограничения, такие как будет работать только в chrome и FF и с самим Python.

Если вас интересуют привязки Selenium Python, я бы переписал ваш код, как показано ниже :

 driver.maximize_window()
driver.get("https://app.raizinvest.com.au/login")
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.NAME, "email"))).send_keys('testaccountraiz@yahoo.com')
wait.until(EC.element_to_be_clickable((By.NAME, "password"))).send_keys('Test4321')
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']"))).click()
 

Импорт :

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 

Селен — Python — Явное ожидание

Python — Гелий — Установка

Python — Гелий — API

Комментарии:

1. Спасибо за быстрый ответ, но я хочу использовать что-то другое, кроме селена, так как он ненадежно работает на моем raspberry pi. Также взглянул на Гелий по вашему совету, но, похоже, ему нужна 64-битная ОС, и у меня установлена 32-битная версия.

2. Ну, у вас есть аппаратные ограничения. Поскольку вы хотите автоматизировать браузер, я бы лично рекомендовал вам использовать selenium. Вы пробовали с явным ожиданием ? Это все еще не стабильно с явным ожиданием ? Еще один вариант, который у вас есть, — кипарис.

3. Нет, у меня проблемы с несовместимостью версий selenium и chrome, и когда я выполняю определенные обновления и т. Д. он часто ломается, и мне приходится загружать устаревшие версии того или другого. В данный момент у меня работает Селен, но за последние несколько месяцев он выходил из строя примерно 3 раза, и каждый раз мне требуется целая вечность, чтобы разобраться в этом. Я бы предпочел безголовый вариант без браузера, такой как requests_html, если он может работать также потому, что он легче на оборудовании и более стабилен.

4. Да, безголовый также является хорошим вариантом, или есть способ, с помощью которого вы можете автоматически обновить драйвер chrome, вам не нужно настраивать его вручную

5. вот что, я думаю, вызывает проблему. Когда я запускаю автоматическое обновление всех пакетов и т. Д., Это то, что его наполняет. Часть проблемы, по-видимому, заключается в том, что да, он использует драйвер chrome, но сам «хром» недоступен для raspberry pi, и вместо этого «хром» является частью проблемы. Во всяком случае, именно поэтому я действительно стараюсь избегать селена. Весь мой портфель акций поступает автоматически, и мне это тоже нужно, чтобы делать это надежно. Этот Pi также запускает мой домашний сервер помощника и другие домашние серверы, поэтому, хотя я должен начать все с нуля, это не вариант.