formrequest url web-scraping scrapy http-status-code-404

formrequest - Scrapy: error de URL, el programa agrega caracteres innecesarios(códigos URL)



formrequest scrapy (2)

Esto puede suceder si el espacio en blanco y las pestañas están en el código html.

Puede limpiar la URL usando process_value de LinkExtractor y hacer algo como:

... Rule(LinkExtractor(allow=(r''threads//w+'',)), callback=''parse_thread'', process_value=clean_url) ... def clean_url(value): value = value.replace(u''%0A'', '''') value = value.replace(u''%09'', '''') return value

Estoy usando Scrapy para rastrear un foro alemán: http://www.musikerboard.de/forum

Sigue todos los subforos y extrae información de los hilos.

El problema: durante el rastreo, me da un error en los enlaces de subprocesos:

2015-09-26 14:01:59 [scrapy] DEBUG: Ignoring response <404 http://www.musiker-board.de/threads/spotify-premium-paket.621224/%0A%09%09>: HTTP status code is not handled or not allowed

La URL está bien, excepto esta parte /%0A%09%09

Da un error 404.

No sé por qué el programa sigue agregando el código al final de la URL

Aquí está mi código:

def urlfunc(value): value = value.replace("%0A", "") value = value.replace("%09", "") return value class spidermider(CrawlSpider): name = ''memberspider'' allowed_domains = ["musiker-board.de"] start_urls = [''http://www.musiker-board.de/forum/'' # ''http://www.musiker-board.de/'' ] # urls from which the spider will start crawling rules = ( Rule(LinkExtractor(allow=(r''forum//w*'',))), Rule(LinkExtractor(allow=(r''threads//w+'',),deny=(r''threads//w+/[/W/d]+''),process_value=urlfunc), callback=''parse_thread'' ), )

¿Alguien tiene una explicación de por qué sigue sucediendo? (Y una solución)

EDITAR: código actualizado


Si realiza alguna depuración e investigación manual, encontrará que los valores al final de la URL son metacaracteres. %0A es un %0A línea, %09 es una pestaña horizontal: http://www.w3schools.com/tags/ref_urlencode.asp

Luego, si enriquece su función urlfunc con instrucciones de depuración manual (y aumenta el nivel de registro a INFO para ver mejor los resultados), verá que las URL no terminan con estos caracteres, ya que una cadena se convierte al llamarlo como una sitio web.

def urlfunc(value): print ''orgiginal: '', value value = value.replace(''%0A'', '''').replace(''%09'', '''') print ''replaced: '', value return value

Esto resulta en el siguiente resultado:

orgiginal: http://www.musiker-board.de/posts/7609325/ replaced: http://www.musiker-board.de/posts/7609325/ orgiginal: http://www.musiker-board.de/members/martin-hofmann.17/ replaced: http://www.musiker-board.de/members/martin-hofmann.17/

Las líneas entre el primer resultado y el segundo están ahí en la salida porque tienen los metacaracteres.

Entonces la solución es strip los valores:

def urlfunc(value): return value.strip()

En este caso, no recibirá ningún mensaje de depuración que indique que no se encontró el sitio.