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!')
现在这对我来说很好,但我仍然对爬虫设置未按预期工作的原因感兴趣。
我创建了一个 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!')
现在这对我来说很好,但我仍然对爬虫设置未按预期工作的原因感兴趣。