CrawlSpider / Scrapy-CLOSESPIDER设置不起作用

时间:2020-03-13 13:29:17

标签: python scrapy timeout limit

我创建了一个CrawlSpider,该链接应该跟随所有“内部”链接,直到一定数量的项目/页面/时间。

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

我确实使用来自单独的python脚本的CrawlSpider指令调用os.system

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以上的空间。

1 个答案:

答案 0 :(得分:0)

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

在我的CrawlSpider内,我定义了剪贴程序应停止的最大页面数(self.max_cnt)和一个被检查的计数器(self.max_counter),并为我的剪贴器每一页增加了一个计数器参观过。

如果超过了最大页面数,则通过抬起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!')

这现在对我来说很好,但是我仍然会对爬网程序设置无法按预期运行的原因感兴趣。

相关问题