【问题标题】:Initialise Scrapy setting with values accepted from user as argument使用用户接受的值作为参数初始化 Scrapy 设置
【发布时间】:2019-02-18 12:35:08
【问题描述】:

我想将 HTTPCACHE_DIR 设置设置为用户通过自定义参数提供的值。

【问题讨论】:

  • 要明确一点:你不想使用scrapy crawl myspider -s HTTPCACHE_DIR="..."(它会自动设置值,而是你想使用... -a something=abc,然后在蜘蛛内部构造完整目录?
  • 是的,我想要你描述的方式
  • 我已经删除了我的答案,而是将您转介给这个github.com/scrapy/scrapy/issues/2392#issuecomment-259661978 以另一种方式解决问题可能会更好。制作一个开始执行的脚本包装器,例如:stackoverflow.com/a/42512653/2781701

标签: scrapy


【解决方案1】:

defalut Scrapy 在FileSystemCacheStorage 中使用HTTPCACHE_DIR 设置,这是HttpCacheMiddleware 的一部分:

class FilesystemCacheStorage(object):

    def __init__(self, settings):
        self.cachedir = data_path(settings['HTTPCACHE_DIR'])
        self.expiration_secs = settings.getint('HTTPCACHE_EXPIRATION_SECS')
        self.use_gzip = settings.getbool('HTTPCACHE_GZIP')
        self._open = gzip.open if self.use_gzip else open

如您所见,当 Scrapy 创建 FilesystemCacheStorage 时,Scrapy 仅读取一次 HTTPCACHE_DIR 设置参数。即使您稍后以某种方式更改 HTTPCACHE_DIR 设置它也不会更改 cachedir。
在抓取过程中更改 cachedir 的唯一方法是更改​​ FilesystemCacheStorage 对象的 cachedir 属性。 您可以在蜘蛛代码中实现这一点:
(对于scrapy crawl myspider -a HTTPCACHE_DIR="cache_dir"

import scrapy
class MySpider(scrapy.Spider):
    def start_requests(self):
        if self.HTTPCACHE_DIR:
            #Select downloader middlewares
            downloader_middlewares = self.crawler.engine.downloader.middleware.middlewares
            #Select HttpCacheMiddleware
            HttpCacheMiddleware = [middleware for middleware in downloader_middlewares if "HttpCacheMiddleware" in str(type(middleware))][0]
            #Change cachedir
            HttpCacheMiddleware.storage.cachedir = scrapy.utils.project.data_path(self.HTTPCACHE_DIR)

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2014-05-27
    • 2019-03-06
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2020-11-02
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多