我使用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)
最佳答案
从精美的手册中:
Scrapy是否以广度优先或深度优先的顺序爬行?
默认情况下,Scrapy使用LIFO队列存储未决请求,
这基本上意味着它按DFO顺序进行抓取。这个命令更多
在大多数情况下都很方便。如果您确实想按真实的BFO顺序进行抓取,
您可以通过设置以下设置来做到这一点:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE ='scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE ='scrapy.squeues.FifoMemoryQueue'
关于python - 在遵循之前先抓取整个网站,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35919212/