Код состояния Scrapy и response: как это проверить? - PullRequest
17 голосов
/ 14 марта 2012

Я использую scrapy для сканирования моей карты сайта, чтобы проверить 404, 302 и 200 страниц. Но я не могу получить код ответа. Это мой код:

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?

Ответы [ 2 ]

24 голосов
/ 14 марта 2012

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

При условии, что промежуточное ПО для пауков по умолчанию включено, коды ответов вне диапазона 200-300 отфильтровываются с помощью HttpErrorMiddleware.Вы можете указать промежуточному программному обеспечению, которое хотите обработать 404, установив атрибут handle_httpstatus_list на своем пауке.

class TothegoSitemapHomesSpider(SitemapSpider):
    handle_httpstatus_list = [404]
2 голосов
/ 31 августа 2017

Только чтобы получить полный ответ здесь:

  • Набор Handle_httpstatus_list = [302];

  • По запросу установите dont_redirect на True на meta .

Например: Request(URL, meta={'dont_redirect': True});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...