Aporte: Web scraping con python y selenium. - Versión para impresión +- ChuJALT (https://chujalt.com) +-- Foro: LENGUAJES PROGRAMACIÓN (https://chujalt.com/forum-18.html) +--- Foro: Python (https://chujalt.com/forum-19.html) +--- Tema: Aporte: Web scraping con python y selenium. (/thread-21.html) |
Web scraping con python y selenium. - chujalt - 07-03-2021 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 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. RE: Web scraping con python y selenium. - blackcatiswhite - 12-09-2023 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() |