【发布时间】:2015-09-01 21:25:38
【问题描述】:
我一直在 Scrapy 中运行一个爬虫来爬取一个我不想提及的大型网站。我使用教程蜘蛛作为模板,然后我创建了一系列启动请求并让它从那里爬取,使用如下内容:
def start_requests(self):
f = open('zipcodes.csv', 'r')
lines = f.readlines()
for line in lines:
zipcode = int(line)
yield self.make_requests_from_url("http://www.example.com/directory/%05d" % zipcode)
首先,有超过 10,000 个这样的页面,然后每个页面都在一个相当大的目录中排队,从中还有几个页面要排队,等等,scrapy 似乎喜欢保持“浅层”,累积请求在内存中等待,而不是深入研究它们然后备份。
这样做的结果是一个重复的大异常,以这样的方式结束:
File "C:\Python27\lib\site-packages\scrapy\utils\defer.py", line 57, in <genexpr>
work = (callable(elem, *args, **named) for elem in iterable)
--- <exception caught here> ---
File "C:\Python27\lib\site-packages\scrapy\utils\defer.py", line 96, in iter_errback
yield next(it)
.....(更多行).....
File "C:\Python27\lib\site-packages\scrapy\selector\lxmldocument.py", line 13, in _factory
body = response.body_as_unicode().strip().encode('utf8') or '<html/>'
exceptions.MemoryError:
很快,在一个需要几天时间的爬虫程序的一个小时左右内,python 可执行文件就会膨胀到 1.8gigs 并且 Scrapy 将不再起作用(继续花费我很多浪费的美元代理使用费!)。
有什么方法可以让 Scrapy 出列、外部化或迭代(我什至不知道正确的词)存储的请求以防止此类内存问题?
(我对编程不是很精通,除了拼凑我在这里或文档中看到的内容,所以我没有能力在引擎盖下进行故障排除,可以这么说 - 我也无法安装经过几天的尝试和阅读,完整的 python/django/scrapy 在 W7 上为 64 位。)
【问题讨论】:
-
不要将 CONCURRENT_ITEMS 设置设置得太高。我将它设置为 60.000,我也得到了 MemoryError。您是否添加了任何并发设置?
标签: python django python-2.7 memory scrapy