我正在编写Scrapy蜘蛛,这将爬行约1000个域。我在想,如果有任何方法来跟踪域名爬行的数量。因为在一个使用进程中抓取1000个域名需要很长时间。
如果我可以跟踪域名的数量过程,那么我可以触发一些任务,如发送电子邮件后爬行的100个域名的1000。
我试着在网上找,但找不到相关的信息。
如果有人知道什么方法,请告诉我。如果我找不到任何方法,那么我必须跟踪urls爬行的数量。但这将是一件好事,如果域名的数量可以跟踪。
class MySpider(CrawlSpider):
name = 'alok2'
# 'list.txt' file have domains which I have to crawl
allowed_domains = [i.split('\n')[0] for i in open('list.txt','r').readlines()]
start_urls = ['http://'+i.split('\n')[0] for i in open('list.txt','r').readlines()]
rules = [Rule(SgmlLinkExtractor(), callback='parse_item',follow=True)]
def __init__(self,category=None, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.count=0 #this is to keep track of domains whose all links have been crawled
def parse_start_url(self, response):
self.parse_item(response)
def parse_item(self, response):
#lines
#lines发布于 2014-03-05 17:54:33
我不确定你所说的“域爬行”是什么意思:是当你处理来自那个域的所有链接时(这可能很长),还是当你遇到一个新的域时。无论如何,我建议你从OffsiteMiddleware中寻找灵感。
打开爬行器时,此中间件将创建一个set()
def spider_opened(self, spider):
self.domains_seen = set()对于每个爬行器回调输出,它都会检查该域是否被允许,这取决于爬行器的allowed_domains属性,但在您的例子中,我猜您有一个空的allowed_domains。您可以将其更改为类似以下内容:
def process_spider_output(self, response, result, spider):
for x in result:
if isinstance(x, Request):
domain = urlparse_cached(x).hostname
if domain and domain not in self.domains_seen:
self.domains_seen.add(domain)
if (len(self.domains_seen) % 100) == 0:
log.msg("seen %d domains so far" % len(self.domains_seen))
yield xhttps://stackoverflow.com/questions/22193685
复制相似问题