es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecutar CrawlerProcess en Scrapy con Splash

Tengo un archivo scrapy+splash para extraer datos. Ahora quiero ejecutar mi archivo scrapy mediante un script, por lo que utilizo CrawlerProcess. Mi archivo es así:

import scrapy
from scrapy_splash import SplashRequest
from scrapy.crawler import CrawlerProcess

class ProvinceSpider(scrapy.Spider):
    name = 'province'

<pre><code>def start_requests(self):
    url = &quot;https://e.vnexpress.net/covid-19/vaccine"

    yield SplashRequest(url=url,callback=self.parse)

def parse(self, response):
    provinces = response.xpath(&quot;//div[@id=&#39;total_vaccine_province&#39;]/ul[@data-weight]&quot;)
    for province in provinces:
        yield{
            &#39;province_name&#39;:province.xpath(&quot;.//li[1]/text()&quot;).get(),
            &#39;province_population&#39;:province.xpath(&quot;.//li[2]/text()&quot;).get(),
            &#39;province_expected_distribution&#39;:province.xpath(&quot;.//li[3]/text()&quot;).get(),
            &#39;province_actual_distribution&#39;:province.xpath(&quot;.//li[4]/text()&quot;).get(),
            &#39;province_distribution_percentage&#39;:province.xpath(&quot;.//li[5]/div/div/span/text()&quot;).get(),
        }
</code></pre>

process = CrawlerProcess(settings={
    "FEEDS": {
        "province.json": {"format": "json"},
    },
})

process.crawl(ProvinceSpider)
process.start() # el script se bloqueará aquí hasta que finalice el proceso de crawling

<code>
Pero cuando ejecuto
</code>
python3 province.py

No se conecta al servidor de Splash por lo tanto, no puede extraer los datos. ¿Alguna idea sobre en qué parte me equivoqué? Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el script no se está conectando al servidor Splash. Una posible razón es que el servidor Splash no esté en ejecución o no sea accesible desde el script.

    Para solucionar este problema, puedes intentar lo siguiente:

    1. Verificar si el servidor Splash está en ejecución:
      docker ps
      

      Este comando debería mostrar un contenedor en ejecución llamado “splash”.

    2. Verificar si la API HTTP de Splash es accesible desde el script:

      curl http://localhost:8050
      

      Este comando debería devolver una respuesta JSON del servidor Splash.

    Si los pasos anteriores funcionan correctamente, entonces el problema puede estar en el propio script. Puedes intentar añadir la configuración de Splash a la configuración de CrawlerProcess para asegurarte de que el script se está conectando al servidor Splash correcto:

    process = CrawlerProcess(settings={
        "FEEDS": {
            "province.json": {"format": "json"},
        },
        'SPIDER_MIDDLEWARES': {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 725,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        },
        'SPLASH_URL': 'http://localhost:8050',
        'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter',
    })
    
    process.crawl(ProvinceSpider)
    process.start() # el script se bloqueará aquí hasta que finalice el proceso de crawling
    

    Asegúrate de reemplazar el valor de ‘SPLASH_URL’ por la dirección correcta de tu servidor Splash.

    Si el problema persiste, puedes intentar añadir algunos logs al script para ver qué está sucediendo:

    import scrapy
    import logging
    from scrapy_splash import SplashRequest
    from scrapy.crawler import CrawlerProcess
    
    class ProvinceSpider(scrapy.Spider):
        name = 'province'
    
        def start_requests(self):
            url = "https://e.vnexpress.net/covid-19/vaccine"
            yield SplashRequest(url=url, callback=self.parse)
    
        def parse(self, response):
            logging.info('Respuesta recibida del servidor Splash: %s', response)
            provinces = response.xpath("//div[@id='total_vaccine_province']/ul[@data-weight]")
            for province in provinces:
                yield{
                    'nombre_provincia':province.xpath(".//li[1]/text()").get(),
                    'poblacion_provincia':province.xpath(".//li[2]/text()").get(),
                    'distribucion_esperada_provincia':province.xpath(".//li[3]/text()").get(),
                    'distribucion_actual_provincia':province.xpath(".//li[4]/text()").get(),
                    'porcentaje_distribucion_provincia':province.xpath(".//li[5]/div/div/span/text()").get(),
                }
    
    process = CrawlerProcess(settings={
        "FEEDS": {
            "province.json": {"format": "json"},
        },
        'SPIDER_MIDDLEWARES': {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 725,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        },
        'SPLASH_URL': 'http://localhost:8050',
        'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter',
    })
    
    process.crawl(ProvinceSpider)
    logging.info('Iniciando el proceso de crawling...')
    process.start() # el script se bloqueará aquí hasta que finalice el proceso de crawling
    logging.info('Proceso de crawling finalizado.')
    

    El script anterior registrará algunos mensajes en la consola que pueden ayudar a identificar el problema.

Comments are closed.