Używam scrapy do indeksowania mojej mapy witryny, aby sprawdzić 404, 302 i 200 stron. Ale wydaje mi się, że nie mogę uzyskać kodu odpowiedzi. To jest mój kod do tej pory:Scrapy i kod statusu reakcji: jak sprawdzić przeciwko niemu?
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()
Od docs scrapy jest, mówili, że parametr response.status jest liczbą całkowitą odpowiadającą kod statusu odpowiedzi. Do tej pory rejestruje tylko adresy URL o statusie 200, a 302 nie są zapisywane w pliku wyjściowym (ale widzę przekierowania w pliku crawl.log). Co mam zrobić, aby "złapać" 302 żądania i zapisać te adresy?
Może moje pytanie jest trochę rozmyte. moim głównym pragnieniem jest napisanie na pliku 200 odpowiedzi, a na inny plik odpowiedzi 302 (URL, który podnosi to 302). możesz zignorować pierwszy blok if. to, czego potrzebuję, to napisanie 200 na pliku ok_log_file i 302 na pliku bad_log_file, i pomyślałem, że mógłbym to zrobić po prostu sprawdzając kod odpowiedzi response.status (ponieważ, jak mówi twój link, są one w 200 -300) –
Kiedy mówi się o zakresie 200-300 oznacza to 200-299. Spróbuj ustawić handle_httpstatus_list = [302] i odpowiedzi, dla których response.status == 302 powinno rozpocząć pobieranie do metody parsowania. – njbooher
następnie bardzo źle zinterpretowałem termin "zasięg". To było dosłowne, ale myślałem, że było przeznaczone dla wszystkich odpowiedzi 2xx i 3xx. Próbuję listę, a ja dam ci znać z powrotem! dziękuję na teraz! –