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.

Scrapy muestra response.request.url dentro de zip().

Estoy intentando crear una función simple de Scrapy que recorra un conjunto de URLs estándar y obtenga su clasificación de Alexa. El resultado que deseo es simplemente dos columnas: una que muestre la clasificación de Alexa obtenida y otra que muestre la URL que se ha analizado.

Todo parece funcionar correctamente, excepto que no puedo hacer que la URL analizada se muestre correctamente en mi resultado. Mi código actual es el siguiente:

import scrapy

class AlexarSpider(scrapy.Spider):
name = ‘AlexaR’
#Actualizaré los dominios permitidos y la URL de inicio una vez que resuelva este problema
start_urls = [‘http://www.alexa.com/siteinfo/google.com/’,
‘https://www.alexa.com/siteinfo/reddit.com’]

def parse(self, response):
    rank = response.css(".rankmini-rank::text").extract()
    url_raw = response.request.url

    #Extraer el contenido en filas
    for item in zip(url_raw,rank):
        scraped_info = {
            'url_raw' : item[0],
            'rank' : item[1]
        }

    yield scraped_info

Y luego, cuando se ejecuta, el código muestra una tabla que muestra:

AlexaRank Output

url_raw rank
h
t 21
t
h
t 1
t

Estas son las clasificaciones obtenidas correctamente (21 y 1), pero el campo url_raw muestra “h” o “t”, en lugar del valor real de la cadena de la URL. He intentado convertir la variable url_raw en una cadena sin éxito.

¿Cómo puedo configurar la variable para que muestre la URL correcta?

¡Gracias de antemano por cualquier ayuda!

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema está en la forma en que estás intentando asignar la URL al diccionario scraped_info. Estás convirtiendo la variable url_raw en una cadena y utilizando eso como clave, lo cual está causando el problema. En su lugar, debes usar ‘url’ como clave y asignar la variable url_raw como su valor. Aquí está el código modificado:

    import scrapy
    
    class AlexarSpider(scrapy.Spider):
        name = 'AlexaR'
        # Actualizaré los dominios permitidos y la URL de inicio una vez que arregle este problema
        start_urls = ['http://www.alexa.com/siteinfo/google.com/', 'https://www.alexa.com/siteinfo/reddit.com']
    
        def parse(self, response):
            rank = response.css(".rankmini-rank::text").extract()
            url_raw = response.request.url
    
            # extraer contenido en filas
            for item in zip(rank, url_raw):
                scraped_info = {
                    'url': item[1],
                    'rank': item[0],
                }
    
                yield scraped_info
    

    Esto debería mostrar la URL correcta junto con el rango de Alexa.

Comments are closed.