私は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を保存するために何をしなければならないのですか?デフォルトのスパイダーミドルウェアが有効になっていると仮定すると
多分私の質問は少しファジィです。私の主な衝動は、ファイルに200の応答を、別のファイルに302の応答(302を生成するURL)を書き込むことです。最初のifブロックを無視することができます。私が必要とするのは、ok_log_fileに200を、bad_log_fileに302を書き込むことです。response.statusの整数コードをチェックするだけで済むでしょう(あなたのリンクが言うように、彼らは200 -300 range) –
200-300の範囲を言いますと200-299を意味します。 handle_httpstatus_list = [302]とresponse.status == 302があなたの解析メソッドに到達するはずの応答を設定してみてください。 – njbooher
それから私は非常にひどく "範囲"の用語をintepreted。それはリテラルでしたが、私はそれが2xxと3xxのすべての応答のために意図されたtoughtでした。私はリストをしようとしていると私はあなたに戻って知らせる!今はありがとう! –