如何为不同的蜘蛛设置相同的缓存文件夹,现在抓取为每个蜘蛛在缓存目录中创建子文件夹

时间:2018-07-19 22:17:27

标签: python caching scrapy web-crawler directory

我有蜘蛛在同一域上运行,第二个蜘蛛在运行取决于第一个蜘蛛的结果,我希望它们共享缓存信息,但是它们在缓存文件夹中创建带有蜘蛛名称的子文件夹,可以为它们设置相同的文件夹?也许scrapy拥有缓存,不为不同的Spider使用不同的文件夹(并支持像'scrapy.extensions.httpcache.FilesystemCacheStorage'这样的压缩?看起来levelDB和DBM也为某些“子文件夹”软件使用了Spider名称)

此外,如果我以某种方式这样做,则可以通过删除httpcache.py中os.path中的spider.name加入FilesystemCacheStorage(或将其更改为scrapy项目名称)来推测:

    def _get_request_path(self, spider, request):
        key = request_fingerprint(request)
        return os.path.join(self.cachedir, spider.name, key[0:2], key)

没有任何特定于meta / spider的信息会阻止它们重用缓存信息吗?

长期阅读的版本(也许我根本没有什么不好的方法):或者我做错了,对于域中链接的某些交叉点的​​多次运行,我应该考虑使用管道吗? 我刮了:

蜘蛛1中的

menu_1 / subelements_1 / subelements_1_2 / items_set_1

然后

蜘蛛2中的

menu_2 / subelements_2 / subelements_2_2 / items_set_2,

,但items_set_1与大约40%的items_set_2相互连接(即相同的项目,例如Universal_item_id相同),在这种情况下,我在items_set_2中不需要它们(来自items_set_1的项目),我发现我不需要不需要在spider2中需要此项目,因为只有当我最终获得该项目时,spider1才具有此数据,因此我有一个文件夹,其中包含300mb的Spider1压缩缓存数据和Spider2的缓存压缩数据(我喜欢:“哦,我们有这个items_set_1中的Universal_item_id,因此我们不会在spider2“)中产生此项目,我从其中两次下载了约40%的空间。因为它们缓存在不同的子文件夹中。

1 个答案:

答案 0 :(得分:1)

您应该尝试仅继承scrapy.extensions.httpcache.FilesystemCacheStorage的子类并覆盖_get_request_path以使用单个文件夹(请参见此处的示例https://github.com/scrapy-plugins/scrapy-splash/blob/master/scrapy_splash/cache.py)。默认的缓存请求指纹不考虑元数据,仅考虑url / body / method和我相信的标头,但仅在配置为这样做的情况下才考虑,

不要忘记在HTTPCACHE_STORAGE配置中指定您的班级。