scrapy url去重

请问scrapy是url自动去重的吗?比如下面这段代码,为什么运行时start_urls里面的重复url会重复爬取了?

class TestSpider(scrapy.Spider):
    name = "test"
    allowed_domains = ["baidu.com"]
    start_urls = ['http://baike.baidu.com/fenlei/%E5%A8%B1%E4%B9%90%E4%BA%BA%E7%89%A9',
                  'http://baike.baidu.com/fenlei/%E5%A8%B1%E4%B9%90%E4%BA%BA%E7%89%A9',
                  'http://baike.baidu.com/fenlei/%E5%A8%B1%E4%B9%90%E4%BA%BA%E7%89%A9',]

    def parse(self, response):
        for sel in response.xpath('//div[@class="grid-list grid-list-spot"]/ul/li'):
            item = TestspiderItem()
            item['title'] = sel.xpath('div[@class="list"]/a/text()')[0].extract()
            item['link'] = sel.xpath('div[@class="list"]/a/@href')[0].extract()
            yield item
阅读 16.1k
4 个回答

建一个Url管理器,就不会重复抓取了

知道了,改成这样就可以了。

def start_requests(self):

yield scrapy.Request('http://baike.baidu.com/fenlei/%E5%A8%B1%E4%B9%90%E4%BA%BA%E7%89%A9', self.parse)
yield scrapy.Request('http://baike.baidu.com/fenlei/%E5%A8%B1%E4%B9%90%E4%BA%BA%E7%89%A9', self.parse)
yield scrapy.Request('http://baike.baidu.com/fenlei/%E5%A8%B1%E4%B9%90%E4%BA%BA%E7%89%A9', self.parse)

1、默认start_urls里的链接不会去重。
如果要实现需要重写start_requests。

def start_requests(self):
    for url in self.start_urls:
        yield Request(url, **dont_filter**=True)

2、是否去重由dont_filter控制
scrapy.Request()添加参数dont_filter=False才会去重。

一般使用redisbloomfilter去重吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题