scrapy deltafetch 配置无效

2 投票
1 回答
771 浏览
提问于 2025-04-18 10:31

开启了deltafetch功能后,scrapy仍然在爬取之前已经爬过的网址。

系统是RHEL 6.5

[root@hostname ~]# python -V
Python 2.6.6

我通过pip安装了deltafetch:

[root@hostname ~]# pip search scrapy
Scrapy                    - A high-level Python Screen Scraping framework
  INSTALLED: 0.18.4
  LATEST:    0.22.2

[root@hostname ~]# pip search scrapylib
scrapylib                 - Scrapy helper functions and processors
  INSTALLED: 1.1.3 (latest)

/usr/lib/python2.6/site-packages/scrapylib/deltafetch.py

我这样配置了我的settings.py:

SPIDER_MIDDLEWARES = {
    'scrapylib.deltafetch.DeltaFetch': 100,
}

DELTAFETCH_ENABLED = True
DOTSCRAPY_ENABLED = True

当我运行爬虫时,DeltaFetch似乎是启用的:

2014-06-20 10:58:00-0400 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware,
DeltaFetch, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware

.scrapy目录被创建了:

[user@hostname output]$ ls -al ../.scrapy
total 12
drwxrwxr-x. 3 user user 4096 Jun 20 10:58 .
drwxrwxr-x. 6 user user 4096 Jun 20 10:58 ..
drwxrwxr-x. 2 user user 4096 Jun 20 10:58 deltafetch

数据库文件正在创建:

[user@hostname output]$ ls -al ../.scrapy/deltafetch/
total 16
drwxrwxr-x. 2 user user  4096 Jun 20 10:58 .
drwxrwxr-x. 3 user user  4096 Jun 20 10:58 ..
-rw-rw-r--. 1 user user 12288 Jun 20 10:58 spider.db

[user@hostname deltafetch]$ file spider.db 
spider.db: Berkeley DB (Hash, version 9, native byte-order)
[user@hostname deltafetch]$ 

但是这个.db文件似乎没有任何状态数据:

[user@hostname deltafetch]$ python
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bsddb
>>> for k, v in bsddb.hashopen("spider.db").iteritems(): print k, v
... 
>>> 

[user@hostname deltafetch]$ db_dump spider.db 
VERSION=3
format=bytevalue
type=hash
db_pagesize=4096
HEADER=END
DATA=END

当我再次运行爬虫时,所有相同的网址又被爬取了一遍,尽管在爬取中有新的内容,但状态数据库似乎没有更新,比如这是之前爬取过的文件:

2014-06-20 11:13:56-0400 [spider] DEBUG: Crawled (200)
<GET http://www.example.com/xxx/xxx/xxx/xxx/xxx.xml>
(referer: None)

我不仅从日志中看到这些文件仍然被爬取,而且我从爬取中生成的.xml文件也又被创建了一遍。

我查看了其他相关的deltafetch问题,但没有解决这个问题,任何帮助都很感激。

1 个回答

1

解决了。

这可能是因为我认为scrapy里面有个bug,或者这只是一个功能。

我的爬虫程序只是简单地在一个网页目录里爬行,获取响应内容并把它写入一个文件:

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

在scrapy和deltafetch看来,这并不算是抓取任何东西。我注意到日志里有“GET”请求的记录,但没有“从哪里抓取”的信息。

我通过给爬虫添加一个项目来解决这个问题,这个项目包含了我从下载的xml文件中提取的一个任意字段。现在,scrapy会填充这个项目,把它写入output.xml文件,所有我需要的xml文件都下载下来了,deltafetch也按预期工作。

我怀疑如果我把xml文件的下载当作项目来处理,然后再写入文件,我就不会遇到这个问题了。等我能搞清楚怎么做(因为python和scrapy并不是我的强项)并测试一下后,我就可以去掉我现在只是用任意提取内容填充的那个项目。

撰写回答