我正在撰写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
答案 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