Eliminación de contenido dinámico usando python-Scrapy
Descargo de responsabilidad: he visto muchas otras publicaciones similares en StackOverflow y traté de hacerlo de la misma manera, pero parece que no funcionan en este sitio web.
Estoy usando Python-Scrapy para obtener datos de koovs.com.
Sin embargo, no puedo obtener el tamaño del producto, que se genera dinámicamente. Específicamente, si alguien pudiera guiarme un poco para obtener la etiqueta de tamaño "No disponible" en el menú desplegable de este enlace, se lo agradecería.
Puedo obtener la lista de tamaños de forma estática, pero al hacerlo solo obtengo la lista de tamaños, pero no cuáles están disponibles.
También puedes solucionarlo con ScrapyJS
(sin necesidad de selenium
un navegador real):
Esta biblioteca proporciona integración Scrapy+JavaScript usando Splash.
Siga las instrucciones de instalación para Splash
y ScrapyJS
, inicie el contenedor Docker Splash:
$ docker run -p 8050:8050 scrapinghub/splash
Coloque las siguientes configuraciones en settings.py
:
SPLASH_URL = 'http://192.168.59.103:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapyjs.SplashMiddleware': 725,
}
DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter'
Y aquí está su araña de muestra que puede ver la información de disponibilidad de tallas:
# -*- coding: utf-8 -*-
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["koovs.com"]
start_urls = (
'http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376',
)
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, self.parse, meta={
'splash': {
'endpoint': 'render.html',
'args': {'wait': 0.5}
}
})
def parse(self, response):
for option in response.css("div.select-size select.sizeOptions option")[1:]:
print option.xpath("text()").extract()
Esto es lo que está impreso en la consola:
[u'S / 34 -- Not Available']
[u'L / 40 -- Not Available']
[u'L / 42']
Por lo que tengo entendido, la disponibilidad de tamaño se determina dinámicamente en JavaScript que se ejecuta en el navegador. Scrapy no es un navegador y no puede ejecutar javascript.
Si está de acuerdo con cambiar a selenium
la herramienta de automatización del navegador , aquí hay un código de muestra:
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox() # can be webdriver.PhantomJS()
browser.get('http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376')
# wait for the select element to become visible
select_element = WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.select-size select.sizeOptions")))
select = Select(select_element)
for option in select.options[1:]:
print option.text
browser.quit()
Imprime:
S / 34 -- Not Available
L / 40 -- Not Available
L / 42
Tenga en cuenta que, en su lugar, Firefox
puede utilizar otros controladores web como Chrome o Safari. También existe la opción de utilizar un PhantomJS
navegador sin cabeza.
También puedes combinar Scrapy con Selenium si es necesario, consulta:
- selenio con scrapy para página dinámica
scrapy-webdriver
seleniumcrawler