我正在尝试构建一个可以有效地从许多网站上抓取文本信息的蜘蛛。由于我是 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 是带有 urls 的文本文件的路径。我还在设置文件中设置了最大深度。这是我的问题:如果我设置了异常,它会在抓取的页面总数(无论哪个站点)达到异常值CLOSESPIDER_PAGECOUNT
时关闭蜘蛛。但是,当我从每个 url 抓取 20 页时,我需要停止抓取。我还尝试使用 self.parsed_number += 1 之类的变量来计数,但这也不起作用 - 似乎scrapy 不会逐个 url 而是将它们混合在一起。非常感谢任何建议!