我使用Scrapy爬虫无限期地爬行网络,我的脚本使用DEPTH_LIMIT = 0。
我有两个主要问题:
start_urls的第一个网站。tumblr或youtube这样的大型网站上,而他则在上面爬行数十亿页。如何避免这种情况?我不能列出deny变量上的每个大站点。。
class MyItem(Item):
url = Field()
class HttpbinSpider(CrawlSpider):
name = "expired"
start_urls = ['http://www.siteA.com']
rules = (
Rule(LinkExtractor(allow=('.com', '.fr', '.net', '.org', '.info', '.casino'),
deny=('facebook','amazon', 'wordpress', 'blogspot', 'free', 'reddit', 'videos', 'youtube', 'google', 'doubleclick', 'microsoft', 'yahoo', 'bing', 'znet', 'stackexchang', 'twitter', 'wikipedia', 'creativecommons', 'mediawiki', 'wikidata'),
),
process_request='add_errback',
follow=True),
)
custom_settings = {
'RETRY_ENABLED': True,
'DEPTH_LIMIT' : 0,
'LOG_ENABLED' : True,
'CONCURRENT_REQUESTS_PER_DOMAIN' : 32,
'CONCURRENT_REQUESTS' : 64,
}
def add_errback(self, request):
self.logger.debug("add_errback: patching %r" % request)
return request.replace(errback=self.errback_httpbin)
def errback_httpbin(self, failure):
self.logger.error(repr(failure))
if failure.check(HttpError):
response = failure.value.response
self.logger.error('HttpError on %s', response.url)
elif failure.check(DNSLookupError):
request = failure.request
self.logger.info('Domain expired : %s', request.url)
elif failure.check(TimeoutError):
request = failure.request
self.logger.error('TimeoutError on %s', request.url)发布于 2016-03-10 16:39:32
从精美的手册上看:
刮痕爬行是宽第一还是深度第一? 默认情况下,Scrapy使用一个LIFO队列来存储挂起的请求,这基本上意味着它按照DFO顺序爬行。在大多数情况下,这个订单更方便。如果您确实想按照真正的BFO顺序爬行,可以通过设置以下设置来完成: DEPTH_PRIORITY =1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue‘ SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue‘
https://stackoverflow.com/questions/35919212
复制相似问题