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.