2012-03-14 6 views
16

私は404、302、200のページをチェックするために、私のサイトマップをクロールするためにscrapyを使用しています。しかし、私は応答コードを取得することができないようです。これはこれまでの私のコードです:治療とレスポンスのステータスコード:どのようにチェックするのですか?

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

scrapyの文書から、response.statusパラメータはレスポンスのステータスコードに対応する整数です。これまでのところ、200のステータスURLだけを記録し、302は出力ファイルには書き込まれません(ただし、crawl.logのリダイレクトを見ることができます)。だから、私は302の要求を "トラップ"してそれらのURLを保存するために何をしなければならないのですか?デフォルトのスパイダーミドルウェアが有効になっていると仮定すると

答えて

21

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

、200-300範囲外の応答コードはHttpErrorMiddlewareによってフィルタリングされます。あなたのスパイダーでhandle_httpstatus_list属性を設定することで、404を処理したいミドルウェアに指示することができます。

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

多分私の質問は少しファジィです。私の主な衝動は、ファイルに200の応答を、別のファイルに302の応答(302を生成するURL)を書き込むことです。最初のifブロックを無視することができます。私が必要とするのは、ok_log_fileに200を、bad_log_fileに302を書き込むことです。response.statusの整数コードをチェックするだけで済むでしょう(あなたのリンクが言うように、彼らは200 -300 range) –

+0

200-300の範囲を言いますと200-299を意味します。 handle_httpstatus_list = [302]とresponse.status == 302があなたの解析メソッドに到達するはずの応答を設定してみてください。 – njbooher

+0

それから私は非常にひどく "範囲"の用語をintepreted。それはリテラルでしたが、私はそれが2xxと3xxのすべての応答のために意図されたtoughtでした。私はリストをしようとしていると私はあなたに戻って知らせる!今はありがとう! –

0

ここだけ完全奏効ました:

  • 設定Handle_httpstatus_list = [302]。

  • リクエストに応じて、dont_redirectをmetaでTrueに設定します。たとえば、Request(URL、meta = {'dont_redirect':True});

関連する問題