ChuJALT

Versión completa: Web scraping con python y selenium.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Saludos.

Vamos a utilizar python y selenium (que es una librería de python) para loguearnos y escribir un post en un foro, todo ello de manera automática.

El script está probado en este mismo foro y funciona perfectamente, aunque en el que se publica aquí he puesto una dirección ficticia.

Lo que vamos a necesitar es, además de tener python instalado, instalarnos la librería selenium

Código:
sudo pip install selenium

y tener el controlador geckodriver, lo podeís bajar de AQUÍ.

Este trabajo está hecho bajo entorno linux y hay que tener ciertas nociones de html porque selenium busca entre los tags para poder trabajar. Lo que busca son elementos por name, id, texto del enlace, texto parcial del enlace, xpath, CSS, tagname y Classname.

Voy a poner en script completo y luego iremos linea por linea.

Código:
#!/usr/bin/env python    
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')
driver.get('https://paginaweb.com')
link = driver.find_element_by_link_text('Iniciar sesión').click()
time.sleep(2)
driver.find_element_by_id('quick_login_username').send_keys("Pepito")
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")
driver.find_element_by_name('submit').click()
time.sleep(5)
driver.find_element_by_link_text('Chistes').click()
time.sleep(2)
driver.find_element_by_class_name('new_thread_button').click()
time.sleep(5)
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")
driver.find_element_by_name('submit').click()
time.sleep(2)
driver.close()

Importamos webdriver de selenium
Código:
from selenium import webdriver

Importamos Time
Código:
import time

Vamos a trabajar con Firefox y le decimos donde está el ejecutable geckodriver
Código:
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')

Le decimos la página web a abrir
Código:
driver.get('https://paginaweb.com')

Buscamos un enlace que tenga el texto "Iniciar sesión" y que lo pulse
Código:
link = driver.find_element_by_link_text('Iniciar sesión').click()

Esperamos 2 segundos a que se cargue la página de autentificación
Código:
time.sleep(2)

En el formulario, la id de la caja de texto donde va el usuario es "quick_login_username" y le enviamos nuestro usuario
Código:
driver.find_element_by_id('quick_login_username').send_keys("Pepito")

En el formulario, la id de la caja de texto donde va la contraseña es "quick_login_password" y le enviamos nuestra contraseña
Código:
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")

En el formulario, el botón de enviar el name es "submit" y hacemos click en él
Código:
driver.find_element_by_name('submit').click()

Esperamos 5 segundos a que la autentificación se realice y se vuelva a cargar la página
Código:
time.sleep(5)

Vamos a postear un chiste, por lo que vamos a ir a la sección chistes, buscamos un enlace con el texto "Chistes" y hacemos click en él
Código:
driver.find_element_by_link_text('Chistes').click()

Esperamos 2 segundos a que se cargue la sección chistes
Código:
time.sleep(2)

El botón para crear un nuevo hilo es una class con el nombre "new_thread_button" lo buscamos y hacemos click en él
Código:
driver.find_element_by_class_name('new_thread_button').click()

Esperamos 5 segundos a que se cargue la caja para hacer los post
Código:
time.sleep(5)

En la caja para hacer posts, la caja de texto para poner el título del post tiene el name "subject", lo buscamos y enviamos el título
Código:
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")

El post en si está en un iframe, lo buscamos por el path, que puede ser absoluto o relativo (es este caso relativo), y le enviamos el texto
Código:
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")

Hacemos click en el botón de envío cuyo name es submit
Código:
driver.find_element_by_name('submit').click()

Esperamos 2 segundos para que se realice la grabación del post
Código:
time.sleep(2)

Y cerramos el navegador y la aplicación
Código:
driver.close()

Con esto habremos conseguido identificarnos y realizar un post.
Saludos.
Hola!!
Estoy intentando hacer web scraping por gusto, porque me gusta. He cogido una página web al azar y estoy usando chat GPT y está siendo una locura porque no tengo ni idea. Llegó un momento que se me descargaban los datos en el prompt, pero no se metían en el archivo .csv que creé en la carpeta del proyecto. Luego lo cambié y dejó de ir y ahora lo he vuelto a cambiar, pero me estoy volviendo loco. Uso Anaconda en Jupyter Lab con Python. Uso GeckoDriver con webdriver y Firefox.
  El caso es que me rastrea la página y todo va bien, salvo que no encuentra los Xpaths, ni los CSS y he probado parciales, totales, start with, include, etc...llevo 7días, 6 horas al día y me estoy volviendo loco porque no sé si es cuestión del código o porque la página es dinámica en su contenido. El caso es que no tengo ni idea y he visto que tu código es muy sencillo, lo he probado en un archivo python y le he dado al play y no hace nada; solo por curiosear, pero supongo que necesitarás de los pipelines.py, settings.py, etc. 
   He probado rutas json, xpath, selectores CSS y nada. Llevo así 3 días con el último código.
   Mi pregunta es: Me estoy enrollando demasiado con el código? hay otra manera más sencilla?
  
  Este es el código que yo uso:
import scrapy
from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions
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.common.exceptions import TimeoutException
from scrapy_selenium import SeleniumRequest

class HunnisaSpider(scrapy.Spider):
    name = 'hunnisa'
    allowed_domains = ['miin-cosmetics.com']
    start_urls = ['https://miin-cosmetics.com/211-tipo-de-piel']

    def start_requests(self):
        for url in self.start_urls:
            firefox_options = FirefoxOptions()
            firefox_options.add_argument("--headless")
            driver = webdriver.Firefox(options=firefox_options)
            yield SeleniumRequest(url=url, callback=self.parse_products, wait_time=20, meta={'driver': driver})

    def parse_products(self, response):
        # Accede al controlador de Selenium desde response.meta
        driver = response.meta['driver']

        try:
            # Espera hasta que los elementos de nombre y precio aparezcan en la página
            WebDriverWait(driver, 300).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, 'h2.product-title a')) and
                EC.presence_of_element_located((By.CSS_SELECTOR, 'div.product-price'))
            )

            # Obtener nombres y precios
            nombre_elements = driver.find_elements(By.CSS_SELECTOR, 'h2.product-title a')
            precio_elements = driver.find_elements(By.CSS_SELECTOR, 'div.product-price')

            for nombre_element, precio_element in zip(nombre_elements, precio_elements):
                nombre = nombre_element.text.strip()
                precio = precio_element.text.strip()

                print("Nombre:", nombre)
                print("Precio:", precio)

        except TimeoutException:
            self.logger.error("No se pudo encontrar información de los productos en esta página.")

        # Cierra el controlador de Selenium después de obtener los datos
        driver.quit()

    def closed(self, reason):
        # Cierra el driver de Selenium cuando la araña termina
        if hasattr(self, 'driver'):
            self.driver.quit()

if __name__ == "__main__":
    from scrapy.crawler import CrawlerProcess

    process = CrawlerProcess()
    process.crawl(HunnisaSpider)
    process.start()