我正在尝试构建一个可以有效地从许多网站上抓取文本信息的蜘蛛.由于我是Python用户,我被提到了Scrapy.但是,为了避免抓取大型网站,我想限制蜘蛛每个网站不超过20页的某个“深度”.这是我的蜘蛛:
class DownloadSpider(CrawlSpider):
name = 'downloader'
download_path = '/home/MyProjects/crawler'
rules = (Rule(SgmlLinkExtractor(),callback='parse_item',follow=True),)
def __init__(self,*args,**kwargs):
super(DownloadSpider,self).__init__(*args,**kwargs)
self.urls_file_path = [kwargs.get('urls_file')]
data = open(self.urls_file_path[0],'r').readlines()
self.allowed_domains = [urlparse(i).hostname.strip() for i in data]
self.start_urls = ['http://' + domain for domain in self.allowed_domains]
def parse_start_url(self,response):
return self.parse_item(response)
def parse_item(self,response):
self.fname = self.download_path + urlparse(response.url).hostname.strip()
open(str(self.fname)+ '.txt','a').write(response.url)
open(str(self.fname)+ '.txt','a').write('\n')
urls_file是带有url的文本文件的路径.我还在设置文件中设置了最大深度.这是我的问题:如果我设置CLOSESPIDER_PAGECOUNT异常,它会在抓取页面总数(无论哪个站点)达到异常值时关闭蜘蛛.但是,当我从每个网址上说20页时,我需要停止抓取.
我也尝试使用像self.parsed_number = 1这样的变量保持计数,但这也不起作用 – 似乎scrapy不会通过url进行url但是将它们混合起来.
任何建议都非常感谢!
最佳答案
我创建了每个类的变量,用stats = defaultdict(int)初始化它,并在parse_item中增加self.stats [response.url](或者可能是你的情况下的关键字可能是(网站,深度)) .
这就是我想象的 – 应该在理论上运作.如果您需要一个例子,请告诉我.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。