2012-03-14 5 views
16

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?

Odpowiedz

21

http://readthedocs.org/docs/scrapy/en/latest/topics/spider-middleware.html#module-scrapy.contrib.spidermiddleware.httperror

Zakładając domyślny spider pośredniej jest włączony, kod odpowiedzi poza zakresu 200-300 są filtrowane przez HttpErrorMiddleware. Możesz określić oprogramowanie pośrednie, które chcesz obsłużyć 404, ustawiając atrybut handle_httpstatus_list na twoim pająku.

class TothegoSitemapHomesSpider(SitemapSpider): 
    handle_httpstatus_list = [404] 
+0

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) –

+0

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

+0

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! –

0

tylko mieć pełną odpowiedź tutaj:

  • Set Handle_httpstatus_list = [302];

  • Na żądanie, ustaw dont_redirect na True na meta. Na przykład Request (URL, meta = {'dont_redirect': True});