首页 > 解决方案 > 在 Scrapy Spider 中模拟测试请求

问题描述

我的目标是测试使用scrapy( Python) 编写的蜘蛛。我尝试过使用contracts,但在我无法测试分页或某些属性是否正确提取的意义上,它确实受到限制。

def parse(self, response):
    """ This function parses a sample response. Some contracts are mingled
    with this docstring.

    @url http://someurl.com
    @returns items 1 16
    @returns requests 0 0
    @scrapes Title Author Year Price
    """

所以第二个想法是mock蜘蛛在一次运行中发出的所有请求,并在testing阶段使用它来检查预期结果。但是,我不确定如何模拟通过蜘蛛发出的每个请求。我查看了各种库,其中之一是betamax。但是,它只支持requestsPython 客户端发出的 http 请求。(如此所述)。还有另一个库vcrpy,但它也只支持有限的客户端。

你在使用请求吗?如果您不使用 Requests,Betamax 不适合您。您应该检查 VCRpy。您是在使用 Sessions 还是在使用功能性 API(例如 requests.get)?

最后一个选项是手动记录所有请求并以某种方式存储它们,但这在蜘蛛发出请求的规模上并不可行。

是否scrapy.Requests使用一些可用于模拟这些请求的下划线 python 客户端?或者有没有其他方法可以模拟http蜘蛛在一次运行中发出的所有请求,并使用它来测试蜘蛛的预期行为?

标签: pythontestingscrapypython-requestsbetamax

解决方案


因此,scrapy内置了对缓存的支持,可用于cache所有响应,并且真正消除mock了响应。

中有各种设置HttpCacheMiddleware。其中一些如下。(被包括在settings.py一个scrapy项目中)

# Cache settings
HTTPCACHE_POLICY = 'scrapy.extensions.httpcache.DummyPolicy'
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0  # Never Expire
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = [301, 302, 404]
HTTPCACHE_IGNORE_MISSING = False
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS = ["no-cache", "no-store"]

这也将 存储cache在指定的目录中。这是选项的完整列表。


推荐阅读