我创建了一个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以上的空间。
答案 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!')
这现在对我来说很好,但是我仍然会对爬网程序设置无法按预期运行的原因感兴趣。