Scrapy:如果适用某些条件,如何重新下载已缓存的URL

时间:2014-05-02 08:51:48

标签: scrapy

我在scrapy中的缓存后端存储了大量的http数据。某些页面包含错误数据。这些网址需要重新安排下次scrapy下载。

我想出了修改scrapy附带的虚拟缓存策略的想法。不幸的是,这似乎不起作用。

任何人都可以看到方法 is_cached_response_fresh 中出现了什么问题?:

import os
import cPickle as pickle
from time import time
from weakref import WeakKeyDictionary
from email.utils import mktime_tz, parsedate_tz
from w3lib.http import headers_raw_to_dict, headers_dict_to_raw
from scrapy.http import Headers
from scrapy.responsetypes import responsetypes
from scrapy.utils.request import request_fingerprint
from scrapy.utils.project import data_path
from scrapy.utils.httpobj import urlparse_cached


class DummyPolicy(object):

    def __init__(self, settings):
        self.ignore_schemes = settings.getlist('HTTPCACHE_IGNORE_SCHEMES')
        self.ignore_http_codes = [int(x) for x in settings.getlist('HTTPCACHE_IGNORE_HTTP_CODES')]

    def should_cache_request(self, request):
        return urlparse_cached(request).scheme not in self.ignore_schemes

    def should_cache_response(self, response, request):
        return response.status not in self.ignore_http_codes

    def is_cached_response_fresh(self, response, request):
        if "thisstring" in response.body.lower():
            print "got mobile page. redownload"
            return False
        else:
            return True

    def is_cached_response_valid(self, cachedresponse, response, request):
        return True

1 个答案:

答案 0 :(得分:0)

我认为这里的答案是你的内容很可能是gzip压缩或缩小。

尝试

from scrapy.utils.gz import gunzip
if "thisstring" in gunzip(response.body).lower()

不能说解决方案是多功能的,但很可能它会在你的情况下起作用。