【问题标题】:Scrapy and response status code: how to check against it?Scrapy 和响应状态码:如何检查它?
【发布时间】:2012-03-14 08:40:10
【问题描述】:

我正在使用 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?

【问题讨论】:

    标签: python scrapy http-status-codes


    【解决方案1】:

    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]
    

    【讨论】:

    • 也许我的问题有点模糊。我的主要冲动是在一个文件上写下 200 个响应,在另一个文件上写下 302 个响应(引发 302 的 url)。您可以忽略第一个 if 块。我需要的是在 ok_log_file 上写 200,在 bad_log_file 上写 302,我认为我可以通过检查 response.status 整数代码来做到这一点(因为,正如你的链接所说,它们在 200 -300 范围)
    • 当它说 200-300 范围时,它意味着我期望的 200-299。尝试设置 handle_httpstatus_list = [302] 和 response.status == 302 应该开始进入您的解析方法的响应。
    • 然后我对“范围”一词的理解非常糟糕。这是字面意思,但我认为它适用于所有 2xx 和 3xx 响应。我正在尝试列表,我会告诉你!现在谢谢!
    • 我完全按照你说的做了,还把 httperrormiddleware 添加到了 spider_middlewares 字典中,但这似乎不会影响我的脚本
    • 实现 100% 需要什么? (为了完整起见)
    【解决方案2】:

    只在这里有一个完整的回应:

    • 设置Handle_httpstatus_list = [302];

    • 根据要求,在 meta 上将 dont_redirect 设置为 True

    例如:Request(URL, meta={'dont_redirect': True});

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2011-05-12
      • 2020-01-04
      相关资源
      最近更新 更多