首页 > 解决方案 > 使用scrapy获取url列表,然后只发送不在给定列表中的请求

问题描述

我想每天抓取一个网站,但只抓取新内容。到目前为止,我已经设置了一个规则,已经刮掉的 url 不会被刮掉,但我想要的是将这些 url 标记为 arleady 刮掉。换句话说,我不想发送请求,而是将该 url 放入列表变量中。

rules = (
    Rule(LinkExtractor(restrict_xpaths="//div[@class='next-page-block no-print']/a"), follow=True),
    Rule(LinkExtractor(restrict_xpaths="//div[@class='list-item']/a", deny=alreadyScraped), callback='parse_item', follow=True)
)

我可以检查 url 是否在列表中,如果没有,则发送请求,如果是 - 放入列表变量中。

rules = (
    Rule(LinkExtractor(restrict_xpaths="//div[@class='next-page-block no-print']/a"), follow=True),
    Rule(LinkExtractor(restrict_xpaths="//div[@class='list-item']/a"), callback='parse_item', follow=True, process_request='checkIfScraped')

def checkIfScraped(self, request):
    #code here

编辑:

def checkIfScraped(self, request):
    if request.url in self.alreadyScraped:
        #put url in a list
    else:
        return request

我能够收集这些 url,但是否可以将它们输出到与 parse_item 相同的输出中?

def parse_item(self, response):
    yield {
        'url': response.request.url,
        'new': 1
    }

如果 url 进入那个已经被抓取的列表,我需要 yield {..., 'new': 0}

标签: pythonpython-3.xscrapy

解决方案


推荐阅读