12-09-2023, 10:32
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()
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()