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!
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:
Esto debería mostrar la URL correcta junto con el rango de Alexa.