【问题标题】:CrawlSpider / Scrapy - CLOSESPIDER settings are not workingCrawlSpider / Scrapy - CLOSESPIDER 设置不起作用
【发布时间】:2020-03-13 13:29:17
【问题描述】:

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

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

我确实从一个单独的 python 脚本调用 CrawlSpideros.systemcomand:

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。

【问题讨论】:

    标签: python scrapy timeout limit


    【解决方案1】:

    在不断寻找答案后,我想出了以下解决方案。

    在我的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!')
    

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

    【讨论】:

    • 仅供参考,它是 scraper(和 scrapescrapedscraping)而不是 scrapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多