Eliminación de contenido dinámico usando python-Scrapy

Resuelto Pravesh Jain asked hace 9 años • 4 respuestas

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.

Pravesh Jain avatar May 20 '15 16:05 Pravesh Jain
Aceptado

También puedes solucionarlo con ScrapyJS(sin necesidad de seleniumun navegador real):

Esta biblioteca proporciona integración Scrapy+JavaScript usando Splash.

Siga las instrucciones de instalación para Splashy 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']
alecxe avatar May 21 '2015 15:05 alecxe

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 seleniumla 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, Firefoxpuede utilizar otros controladores web como Chrome o Safari. También existe la opción de utilizar un PhantomJSnavegador sin cabeza.

También puedes combinar Scrapy con Selenium si es necesario, consulta:

  • selenio con scrapy para página dinámica
  • scrapy-webdriver
  • seleniumcrawler
alecxe avatar May 21 '2015 13:05 alecxe