Tengo un sitio web en el que quiero automatizar algunas acciones, pero la página está generada por 2 archivos JavaScript y está definida así en el html:
<script src="/build/runtime.js"></script><script src="/build/app.js"></script>runtime.js tiene unas 70 líneas y app.js tiene unas 40k líneas... No tengo idea de cómo leer el código ya que no sé nada de JavaScript y mi conocimiento de Pyton es un mero átomo más;)
Compartiría el sitio en particular, pero la página está detrás de un inicio de sesión. Entonces logré llegar a la página usando 2 métodos diferentes, pero no puedo encontrar una manera de presionar los botones dentro de esta siguiente página generada por el JS.
Método 1: Solicitudes y BeautifulSoup, pero se quedó atascado en el bit JS, por lo que cambió al método 2.
import requests from bs4 import BeautifulSoup # Site & creds LOGIN_URL = 'https://website.com/login' USERNAME = 'user' PASSWORD = 'pass' # Pretend to be browser headers = { 'accept': 'text/html,application/xhtml+xml,application/xml', 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } # Start session session = requests.session() # Get login page response = session.get(LOGIN_URL, headers=headers, verify=False) # Get csrf token soup = BeautifulSoup(response.content, 'html.parser') csrf_token = (soup.find(id="login_form__token")["value"]) # Set creds with csfr token payload = { 'login_form[username]': USERNAME, 'login_form[password]': PASSWORD, 'login_form[login]': '', 'login_form[_token]': csrf_token } # Login & do something else with cookies I don't understand response = session.post(LOGIN_URL, data=payload, verify=False) response = session.get('https://website.com/pageIWant', verify=False) soup = BeautifulSoup(response.content, 'html.parser') print(soup.prettify())Método 2 - Selenio y ChromeDriver
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By options = Options() options.headless = True options.add_argument("--window-size=1920,1200") options.add_argument('--disable-gpu') options.add_argument('--disable-software-rasterizer') driver = webdriver.Chrome(options=options, executable_path='chromedriver.exe') driver.get("https://website.com/login") driver.find_element_by_id("login_form_username").send_keys('user') driver.find_element_by_id("login_form_password").send_keys('pass') driver.find_element_by_id("login_form_login").click() driver.get("https://website.com/pageIWant") html = driver.page_source print(html)Así que pensé que el método 2 facilitaría las cosas, pero prácticamente me quedé estancado en el mismo punto. La página generada que quiero contiene botones que necesitaría presionar para acceder a las páginas posteriores. Lea mucho sobre cómo acceder a los elementos, pero no puede ver nada dentro de este valor de 40k de JS jibberish. ¿Dónde es un buen lugar para empezar?
"¿Dónde es un buen lugar para empezar?"
Independientemente de cómo se genere la página (HTML o JS), en última instancia, lo que debe abordar en Selenium es el DOM en vivo de la página. Entonces, "dónde comenzar" es inspeccionar el DOM de la página en las herramientas de desarrollo del navegador y, desde el DOM, descubrir cómo encontrar los elementos del botón en Selenium.