【发布时间】:2016-06-25 10:59:49
【问题描述】:
我使用 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)
【问题讨论】:
标签: python web-scraping scrapy scrapy-spider