📜  在scrapy中不要过滤= true - Python(1)

📅  最后修改于: 2023-12-03 14:51:22.053000             🧑  作者: Mango

在Scrapy中不要过滤=True

很多Scrapy用户似乎会犯一个常见错误,就是将dont_filter=True设置为默认行为,以解决爬虫无法处理重复页面的情况。但是这种做法实际上是不可取的,因为它会导致Scrapy浪费资源,从而降低爬虫的效率。

为什么不要过滤=True?

Scrapy在爬取一个链接时会默认将该链接过滤掉,以避免浪费资源爬取重复的内容。这是由Scrapy内置的去重机制来实现的。因此,如果您将dont_filter=True设置为默认值,则每个链接都会被爬取,即使它已经被爬过了。这样做会导致浪费大量的带宽和爬取时间,从而降低爬虫的效率。

如何正确地使用 dont_filter

实际上,如果您的爬虫配置正确,并且使用常见的去重算法(如哈希或布隆过滤器),则不应该发生重复爬取的情况。因此,建议不要默认设置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。这样可以避免浪费爬取资源,提高爬虫的效率。