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)