python - 在 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。但是,它只支持requests
Python 客户端发出的 http 请求。(如此处所述)。还有另一个库vcrpy,但它也只支持有限的客户端。
你在使用请求吗?如果您不使用 Requests,Betamax 不适合您。您应该检查 VCRpy。您是在使用 Sessions 还是在使用功能性 API(例如 requests.get)?
最后一个选项是手动记录所有请求并以某种方式存储它们,但这在蜘蛛发出请求的规模上并不可行。
是否scrapy.Requests
使用一些可用于模拟这些请求的下划线 python 客户端?或者有没有其他方法可以模拟http
蜘蛛在一次运行中发出的所有请求,并使用它来测试蜘蛛的预期行为?
解决方案
因此,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
在指定的目录中。这是选项的完整列表。
推荐阅读
- react-native - 如何在 iPhone 上使用 HTML5 避免原生全屏视频
- python-3.x - 通过“兄弟”继承进行跨类调用?
- python - 无法从 OpenCV Gstreamer 接收 gstreamer UDP 流
- java - 为什么让我们加密在银行端对我的heroku资源的http请求中引发异常的ssl证书
- javascript - 带有中心文本的圆形形状不起作用React Native iOS
- c# - C# 中的抽象是什么?
- c# - ASP.NET Core Web API:将应用设置值注入控制器路由
- mysql - 创建新用户时的Mysql问题
- svg - 如何将等级规则表应用于 DXF?
- java - 如何在 UTC 区域中获取当前日期作为 java 8 中的长值