📅  最后修改于: 2023-12-03 14:51:22.053000             🧑  作者: Mango
很多Scrapy用户似乎会犯一个常见错误,就是将dont_filter=True
设置为默认行为,以解决爬虫无法处理重复页面的情况。但是这种做法实际上是不可取的,因为它会导致Scrapy浪费资源,从而降低爬虫的效率。
Scrapy在爬取一个链接时会默认将该链接过滤掉,以避免浪费资源爬取重复的内容。这是由Scrapy内置的去重机制来实现的。因此,如果您将dont_filter=True
设置为默认值,则每个链接都会被爬取,即使它已经被爬过了。这样做会导致浪费大量的带宽和爬取时间,从而降低爬虫的效率。
实际上,如果您的爬虫配置正确,并且使用常见的去重算法(如哈希或布隆过滤器),则不应该发生重复爬取的情况。因此,建议不要默认设置dont_filter=True
,而是在必要的时候将其应用于特定的链接请求中。
下面是一个示例:
import scrapy
class MySpider(scrapy.spiders.Spider):
name = "my_spider"
start_urls = [
"https://www.example.com",
"https://www.example.com/page2",
"https://www.example.com/page3",
]
def parse(self, response):
# 在这里解析页面并提取链接
links = response.css("a::attr('href')").getall()
for link in links:
yield scrapy.Request(url=link, callback=self.parse_page, dont_filter=True)
def parse_page(self, response):
# 在这里解析页面并提取数据
pass
在上述示例中,我们在特定的链接请求中使用了dont_filter=True
。这可以确保Scrapy不会过滤掉这些链接。
在Scrapy中使用dont_filter=True
默认行为是一种常见但并不推荐的做法。相反,我们应该使用内置的去重机制来避免重复的爬取,并仅在必要的情况下使用dont_filter=True
。这样可以避免浪费爬取资源,提高爬虫的效率。