python - formrequest - scrapy robotstxt_obey
Scrapy y código de estado de respuesta: ¿cómo verificarlo? (2)
Sólo para tener una respuesta completa aquí:
Establecer
Handle_httpstatus_list = [302];
A petición, establezca dont_redirect en True en meta .
Por ejemplo: Request(URL, meta={''dont_redirect'': True});
Estoy usando scrapy para rastrear mi mapa del sitio, para verificar 404, 302 y 200 páginas. Pero parece que no puedo obtener el código de respuesta. Este es mi código hasta ahora:
from scrapy.contrib.spiders import SitemapSpider
class TothegoSitemapHomesSpider(SitemapSpider):
name =''tothego_homes_spider''
## robe che ci servono per tothego ##
sitemap_urls = []
ok_log_file = ''/opt/Workspace/myapp/crawler/valid_output/ok_homes''
bad_log_file = ''/opt/Workspace/myapp/crawler/bad_homes''
fourohfour = ''/opt/Workspace/myapp/crawler/404/404_homes''
def __init__(self, **kwargs):
SitemapSpider.__init__(self)
if len(kwargs) > 1:
if ''domain'' in kwargs:
self.sitemap_urls = [''http://url_to_sitemap%s/sitemap.xml'' % kwargs[''domain'']]
if ''country'' in kwargs:
self.ok_log_file += "_%s.txt" % kwargs[''country'']
self.bad_log_file += "_%s.txt" % kwargs[''country'']
self.fourohfour += "_%s.txt" % kwargs[''country'']
else:
print "USAGE: scrapy [crawler_name] -a country=[country] -a domain=[domain] /nWith [crawler_name]:/n- tothego_homes_spider/n- tothego_cars_spider/n- tothego_jobs_spider/n"
exit(1)
def parse(self, response):
try:
if response.status == 404:
## 404 tracciate anche separatamente
self.append(self.bad_log_file, response.url)
self.append(self.fourohfour, response.url)
elif response.status == 200:
## printa su ok_log_file
self.append(self.ok_log_file, response.url)
else:
self.append(self.bad_log_file, response.url)
except Exception, e:
self.log(''[eccezione] : %s'' % e)
pass
def append(self, file, string):
file = open(file, ''a'')
file.write(string+"/n")
file.close()
De los documentos de scrapy, dijeron que el parámetro response.status es un entero que corresponde al código de estado de la respuesta. Hasta ahora, solo registra las 200 URL de estado, mientras que las 302 no están escritas en el archivo de salida (pero puedo ver las redirecciones en crawl.log). Entonces, ¿qué tengo que hacer para "atrapar" las solicitudes 302 y guardar esas URL?
Suponiendo que el middleware predeterminado de la araña está habilitado, los códigos de respuesta fuera del rango 200-300 se filtran mediante HttpErrorMiddleware. Puede decirle al middleware que desea manejar 404s configurando el atributo handle_httpstatus_list en su araña.
class TothegoSitemapHomesSpider(SitemapSpider):
handle_httpstatus_list = [404]