python web-scraping scrapy

Raspado de contenido dinámico usando python-Scrapy



scrapy javascript (4)

Enfrenté ese problema y lo resolví fácilmente siguiendo estos pasos

pip install splash
pip install scrapy-splash
pip install scrapyjs

descargar e instalar docker-toolbox

abra docker-quickterminal y entre

$ docker run -p 8050:8050 scrapinghub/splash

Para configurar SPLASH_URL, verifique la ip predeterminada configurada en la máquina acoplable ingresando
$ docker-machine ip default (Mi IP era 192.168.99.100)

SPLASH_URL = ''http://192.168.99.100:8050'' DOWNLOADER_MIDDLEWARES = { ''scrapyjs.SplashMiddleware'': 725, } DUPEFILTER_CLASS = ''scrapyjs.SplashAwareDupeFilter''

¡Eso es!

Descargo de responsabilidad: he visto muchas otras publicaciones similares en StackOverflow e intenté 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 sobre cómo obtener la etiqueta de tamaño ''No disponible'' del menú desplegable en this enlace, estaría agradecido.

Puedo obtener la lista de tamaños estáticamente, pero al hacerlo solo obtengo la lista de tamaños, pero no cuál de ellos está disponible.


Por lo que entiendo, 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 la herramienta de automatización del navegador selenium , 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 lugar de Firefox puede usar otros controladores web como Chrome o Safari. También hay una opción para usar un navegador PhantomJS sin cabeza.

También puede combinar Scrapy con Selenium si es necesario, consulte:


También puede resolverlo con ScrapyJS (sin necesidad de selenium y un navegador real):

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

Siga las instrucciones de instalación para Splash y ScrapyJS , inicie el contenedor ScrapyJS salpicadura:

$ docker run -p 8050:8050 scrapinghub/splash

Ponga la siguiente configuración 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 tamaño:

# -*- 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'']


scrapy.readthedocs interpretar el json del sitio web, ejemplos scrapy.readthedocs y testingcan.github.io

import scrapy import json class QuoteSpider(scrapy.Spider): name = ''quote'' allowed_domains = [''quotes.toscrape.com''] page = 1 start_urls = [''http://quotes.toscrape.com/api/quotes?page=1] def parse(self, response): data = json.loads(response.text) for quote in data["quotes"]: yield {"quote": quote["text"]} if data["has_next"]: self.page += 1 url = "http://quotes.toscrape.com/api/quotes?page={}".format(self.page) yield scrapy.Request(url=url, callback=self.parse)