CrawlSpider / Scrapy - CLOSESPIDER 设置不起作用

CrawlSpider / Scrapy - CLOSESPIDER settings are not working

我创建了一个 CrawlSpider,它应该遵循所有“内部”链接,最多一定数量的项目/页面/时间。

我正在使用 multiprocessing.Pool 同时处理几个页面(例如 6 个工人)。

我确实从单独的 python 脚本中使用 os.system 命令调用 CrawlSpider

import os
...

cmd = "scrapy crawl FullPageCrawler -t jsonlines -o "{0}" -a URL={1} -s DOWNLOAD_MAXSIZE=0 -s CLOSESPIDER_TIMEOUT=180 -s CLOSESPIDER_PAGECOUNT=150 -s CLOSESPIDER_ITEMCOUNT=100 -s DEPTH_LIMIT=5 -s DEPTH_PRIORITY=0 --nolog'.format(OUTPUT_FILE, url.strip())"
os.system(cmd)

它对我的一些页面效果很好,但对于特定页面,crawler 不遵循我的任何设置。

我试图定义以下内容(根据我的想法):
CLOSESPIDER_PAGECOUNT: 他会关注多少页?
CLOSESPIDER_ITEMCOUNT: 不确定这个。与 PAGECOUNT 有什么区别?
CLOSESPIDER_TIMEOUT:爬虫应该工作的最长时间。

现在我面对的例子已经抓取了超过 4000 个页面(或项目?!)并且已经超过 1 小时。

我 运行 加入这个是因为我同时定义了所有内容吗?
我还需要在 settings.py 中定义相同的设置吗?
其中一个对我来说足够了吗? (例如最长正常运行时间 = 10 分钟)

我尝试使用 subprocess.Popen 而不是 os.system,因为它具有 wait 功能,但这也没有按预期工作。

毕竟使用 os.system 是我尝试过的最稳定的方法,我想坚持使用它。唯一的问题是 scrapy

我尝试在 SO 上搜索答案,但找不到任何帮助!

编辑: 上面的示例以 16.009 已删除 个子页面和超过 333 MB 结束。

在继续寻找答案后,我想到了以下解决方案。

在我的 CrawlSpider 中,我定义了 scraper 应该停止的最大页数 (self.max_cnt) 和一个被检查的计数器 (self.max_counter) 并且我的 scraper 访问的每一页都会增加。

如果超过最大页面数,蜘蛛将通过提高 scrapy.exception.CloseSpider.

来关闭
class FullPageSpider(CrawlSpider):
    name = "FullPageCrawler"
    rules = (Rule(LinkExtractor(allow=()), callback="parse_all", follow=True),)

    def __init__(self, URL=None, *args, **kwargs):
        super(FullPageSpider, self).__init__(*args, **kwargs)
        self.start_urls = [URL]
        self.allowed_domains = ['{uri.netloc}'.format(uri=urlparse(URL))]
        self.max_cnt = 250
        self.max_counter = 0

    def parse_all(self, response):
        if self.max_counter < self.max_cnt:
                self.max_cnt += 1
                
                ...

        else:
            from scrapy.exceptions import CloseSpider
            raise CloseSpider('Exceeded the number of maximum pages!')

现在这对我来说很好,但我仍然对爬虫设置未按预期工作的原因感兴趣。