scrapy delta fetch不起作用

2 投票
1 回答
823 浏览
提问于 2025-04-17 23:27

我正在使用 scrapy 0.20 版本。

我不想再抓取已经抓取过的链接。

我使用了 deltafetch 这个插件。

我在设置中做了如下配置:

SPIDER_MIDDLEWARES = {
    'TestSpider.deltafetch.DeltaFetch': 100,
}
DELTAFETCH_ENABLED = True
DOTSCRAPY_ENABLED = True

但是我的爬虫还是在抓取那些已经抓取过的内容。

注意

在我的日志文件中,没有出现 Ignoring already visited: 这句话,而这正是 deltafetch 记录的内容。因此,条件 if self.db.has_key(key): 永远不会变为真。

1 个回答

0

我想问清楚一些事情,但我不能。所以我就直接说吧,我遇到了同样的问题。我只是爬取一个网站,把响应的内容写到一个文件里:

def parse_funstuff(self, response):
    filename = response.url.split("/")[-1]
    open(filename, 'wb').write(response.body)

但是scrapy+deltafetch并没有把这当作是抓取,所以没有记录到deltafetch数据库里。

如果你也在做类似的事情,可以尝试把文件下载当作一个项目来处理(我还不太确定怎么做),或者像我一样找到一个解决办法;我在parse_funstuff里实现了一个项目,用我从目标xml文件中抓取的任意值来填充。这样就会写入到输出的xml文件中,命令是“scrapy crawl test_fun --set FEED_FORMAT=xml”,这个文件和我下载的xml文件是不同的。这样一来,scrapy+deltafetch就能看到从每个.xml文件的URL中抓取到了东西,并在后续的爬取中忽略它。我在parse_funstuff里添加了以下内容:

    xxs = XmlXPathSelector(response)
    xxs.remove_namespaces()
    sites = xxs.select("//funstuff/morefun")
    items = []
    for site in sites:
        item = FunItem()
        item['stuff'] = site.select("//funstuff/FunStuff/funny/ID").extract()
        items.append(item)
    return items

这样解决了我在使用scrapy+deltafetch时遇到的问题。检查一下你的日志,确保scrapy+deltafetch认为你确实抓取到了东西,仅仅一个“GET”请求似乎不够,确保你在日志中看到“Scraped from”。

撰写回答