我正在尝试建立一个蜘蛛,可以有效地从许多网站抓取文本信息。因为我是一个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')
url_file是指向包含url的文本文件的路径。我还在设置文件中设置了最大深度。我的问题是:如果我设置CLOSESPIDER_PAGECOUNT
异常,那么当总的页面数(不管是哪个站点)达到异常值时,它会关闭spider。然而,我需要停止刮取,当我已经刮,比如从每个网址20页。
我还试着用一个像自我分析的_编号+=1,但这也不起作用——看来,scrapy不是逐个url,而是将它们混合在一起。
任何建议都将不胜感激!在
为此,您可以基于SgmlLinkExtractor创建自己的链接提取器类。应该是这样的:
此子类的代码完全基于SgmlLinkExtractor类的代码。我刚刚添加了变量self.max_页到类构造函数和在提取链接方法末尾剪切链接列表的行。但你可以用更聪明的方式来删除这个列表。在
我将生成每类变量,在
parse_item
中用stats = defaultdict(int)
和递增self.stats[response.url]
(或者在您的例子中可能是一个像(website, depth)
的元组)初始化它。在我就是这么想的-理论上应该行得通。如果你需要一个例子,请告诉我。在
仅供参考,您可以在
urlparse.urlparse
的帮助下提取基url并计算深度(请参见docs)。在相关问题 更多 >
编程相关推荐