如何跟踪Scrapy中已爬网的域数

时间:2014-03-05 09:32:52

标签: python scrapy

我正在撰写Scrapy Spider,它将抓取大约1000个域名。我在想是否有任何方法可以跟踪已爬网的域数。因为在一个使用过程中抓取1000个域需要很长时间。

如果我可以跟踪域进程的数量,那么我可以触发一些任务,例如在抓取1000个域中的100个域后发送电子邮件。

我试图在互联网上找到但无法获得相关信息。

如果有人知道的话请告诉我。如果我找不到任何方法,那么我必须跟踪抓取的网址数量。但如果可以追踪多个域,那就好了。

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

1 个答案:

答案 0 :(得分:1)

我不确定“抓取域名”是什么意思:当你处理来自该域的所有链接(可能非常长)或者遇到新域时。 无论如何,我建议你看看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 x