SE VIENE HILO UN LARGO.
El código adjunto puede que de algún error en algún momento, pero como muchos yo estoy aprendiendo así que os jodéis, que no he visto a nadie subir algo así y me ha llevado un buen rato hacerlo todo.
Hoy os traigo un hilo que os va a volar la cabeza

. Os voy a enseñar cómo con
Python y un poco de cerebro (si tienes, claro), puedes hacer un
scraping de productos de Amazon y sacar nombres, precios, enlaces... todo como un auténtico cerdo trufero

.
¿Estás listo o vuelves a la cueva? Vamos al lío:
¿Qué hace este código?
Te pide que le digas qué quieres buscar, rollo "bragas de abuela", "velas aromáticas" o "sables láser de dos euros". Luego, se pone a trabajar como si le debiera dinero a Hacienda: busca productos en Amazon, extrae los datos y los guarda en un .txt para que tú, máquina, lo tengas todo mascadito.
¿Qué necesitas para que no te explote el cerebro?
Primero, instala las librerías necesarias:
Código:
pip install selenium beautifulsoup4
Segundo, necesitas el navegador Edge instalado y configurado (sí, Edge, no te quejes). Y tercero,
quita el comentario de esta línea si quieres que sea más sigiloso que un ninja:
Python:
# options.add_argument("--headless")
Código completito
Aquí tienes la joya de la corona. Cópialo, pégalo y que el dios de Python se apiade de ti:
Python:
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
import urllib.parse
def setup_driver():
options = Options()
# options.add_argument("--headless") QUITAR EL COMENTARIO EN ESTA LÍNEA PARA QUE FUNCIONE SIN ABRIR UN NAVEGADOR.
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-software-rasterizer")
options.add_argument("--disable-extensions")
options.add_argument("--disable-webgl")
options.add_argument("--disable-accelerated-2d-canvas")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
service = Service()
return webdriver.Edge(service=service, options=options)
def search_amazon(driver, search_term: str):
encoded_search = search_term.replace(" ", "+")
url = f"https://www.amazon.es/s?k={encoded_search}"
driver.get(url)
print(f"Buscando: {search_term}")
print(f"URL de búsqueda: {url}")
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.s-main-slot"))
) # Esperar a que se carguen los productos
def get_product_info(driver):
products = []
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
product_elements = soup.find_all('div', {'data-component-type': 's-search-result'})
print(f"Encontrados {len(product_elements)} elementos de producto")
for element in product_elements:
try:
link_element = element.find('a', class_='a-link-normal s-line-clamp-4 s-link-style a-text-normal')
if not link_element:
continue
link = "https://www.amazon.es" + link_element['href']
driver.get(link)
# Esperar explícitamente al título del producto
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "productTitle"))
)
# Extraemos la página fuente de la página del producto
product_html = driver.page_source
product_soup = BeautifulSoup(product_html, 'html.parser')
# Buscar el nombre del producto desde el <span id="productTitle">
name_element = product_soup.find('span', id='productTitle')
name = name_element.text.strip() if name_element else "Nombre no disponible"
# Buscar el precio del producto
price_whole = product_soup.find('span', class_='a-price-whole')
price_fraction = product_soup.find('span', class_='a-price-fraction')
price_symbol = product_soup.find('span', class_='a-price-symbol')
if price_whole and price_fraction and price_symbol:
price = f"{price_whole.text.strip()},{price_fraction.text.strip()} {price_symbol.text.strip()}"
else:
price = "Precio no disponible"
# Buscar la política de devoluciones
try:
return_policy = driver.find_element(By.CLASS_NAME, 'offer-display-feature-text')
has_return_policy = "Sí" if return_policy and product_soup.find('span', class_='a-size-small a-color-tertiary offer-display-feature-text-message') == "Ver política de devoluciones" else "No"
except TimeoutException:
has_return_policy = "No"
products.append({
"name": name,
"price": price,
"link": link,
"has_return_policy": has_return_policy
})
print(f"Producto añadido: {name[:50]}... - Política de devoluciones: {has_return_policy}")
except Exception as e:
print(f"Error al procesar un producto: {str(e)}")
print(f"Detalle del error: {e}")
continue
return products
def next_page(driver, search_term, page_number):
# Modificar la URL con el número de la página siguiente
encoded_search = search_term.replace(" ", "+")
next_page_url = f"https://www.amazon.es/s?k={encoded_search}&page={page_number}"
driver.get(next_page_url)
print(f"Navegando a la página {page_number}")
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.s-main-slot"))
) # Esperar a que se carguen los productos
# Verificar si la página contiene productos, si no, detener la paginación
products = get_product_info(driver)
if len(products) == 0:
print("No se encontraron más productos. Deteniendo la búsqueda.")
return False # No hay productos, detener la búsqueda
return True # Hay productos, seguir con la paginación
def main():
driver = setup_driver()
search_term = input("¿Qué quieres buscar? ")
search_amazon(driver, search_term)
all_products = []
page = 1
while True:
print(f"\nProcesando página {page}")
products = get_product_info(driver)
all_products.extend(products)
with open("productos_encontrados.txt", "a", encoding="utf-8") as f:
for product in all_products:
f.write("-Producto encontrado-\n")
f.write(f"Nombre: {product['name']}\n")
f.write(f"Precio: {product['price']}\n")
f.write(f"Enlace: {product['link']}\n")
f.write(f"Política de devoluciones visible: {product['has_return_policy']}\n\n")
print(f"\nSe han guardado {len(all_products)} productos en 'productos_encontrados.txt'")
user_input = input("Presiona Enter para continuar a la siguiente página o 'q' para salir: ")
if user_input.lower() == 'q':
break
# Llamamos a next_page() con el número de página incrementado
if not next_page(driver, search_term, page + 1):
break # Si no hay más productos, salir del bucle
page += 1
driver.quit()
if __name__ == "__main__":
main()
Cosas que vas a aprender (si no eres un zombi):
Scraping dinámico: Cómo manejar webs que cambian más que tu ex con Selenium y BeautifulSoup.
Automatización de búsquedas: El código construye URLs para buscar lo que te salga del alma.
Extracción y almacenamiento: Aprende a sacar datos útiles sin que te duela la cabeza.
Esto es IMPORTANTE, así que léelo antes de irte a jugar a hacker:
Esto se hace con fines educativos. Sí, EDU-CA-TI-VOS. Nada de ir por ahí rascando datos a lo loco o liándola en Amazon. Si haces cosas chungas,
te pillan y te jodes tú solito.
Aquí no hacemos el mal, ¿entendido? Esto es para que aprendas lo que se puede hacer con Python y que sepas cómo funcionan las webs. No seas el típico idiota que usa esto y luego llora cuando le bloquean la cuenta o algo peor.
Si te gusta, dale like al hilo y comenta algo, que esto no lo hago todos los días y han sido varias horas por la puta cantidad de fallos que me ha dado mientras iba aprendiendo a usar selenium y beautifulsoup
Me cago en todo que odio hablar por el chat y así no me voy a ganar el rango de noder. Bueno, al menos tenéis este contenido por la cara sin hidden content.