class BrokenLinksSpider(CrawlSpider):
name = test
start_urls = "your_url"
def parse(self, response):
flag = response.meta.get('flag')
if flag or flag==None:
extractor = LinkExtractor(deny_domains="")
links = extractor.extract_links(response)
for link in links:
if link.url[:8]=="your_url":
new_request = Request(link.url, callback=self.parse,meta={'flag': True})
else:
new_request = Request(link.url, callback=self.parse,meta={'flag': False})
yield new_request
4条答案
按热度按时间vecaoik11#
您可以将spider建立在
CrawlSpider
类的基础上,并将Rule
与已实现的process_links
方法一起使用,该方法将传递给Rule
。该方法将在不需要的链接被跟踪之前过滤掉它们。请参阅文档:process_links
是一个可调用项或字符串(在这种情况下,将使用来自具有该名称的蜘蛛对象的方法),将使用指定的link_extractor
为从每个响应中提取的每个链接列表调用该字符串。这主要用于过滤目的。vltsax252#
我通过传递一个参数给回调函数找到了一个解决方案。如果url是内部链接,我将flag设置为true(否则为false)。如果flag返回false(外部链接),爬虫不会提取新链接。下面是我的示例代码:
relj7zay3#
不是一个内置的解决方案,但我相信你将不得不自己中断递归。你可以很容易地通过保持一个数组(一组)的域在您的蜘蛛和中断或忽略。
类似的事情:
x33g5p2x4#
为了补充@mcavdar的答案,响应在
response.meta['depth']
处有一个Depth属性,可以使用该属性而不必设置任何标志。