pyspider 把一个方法里获取的至传到另一个方法中

2015-06-23 17:51:43 +08:00
 m939594960

官方手册里这样写的

def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
           save={'a': 123})
def callback(self, response):
    return response.save['a']

我是这样写的。

@every(minutes=24 * 60)
def on_start(self):
    self.crawl('http://baidu.com', callback=self.index_page,
           save={'a': 123 })

@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
    print response.save['a']
    for each in response.doc('a[href^="http"]').items():
        self.crawl(each.attr.href, callback=self.detail_page)

报错
[E 150623 17:50:22 basehandler:193] 'NoneType' object has no attribute 'getitem'
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/pyspider/libs/base_handler.py", line 186, in run_task
result = self._run_task(task, response)
File "/usr/local/lib/python2.7/dist-packages/pyspider/libs/base_handler.py", line 166, in _run_task
return self._run_func(function, response, task)
File "/usr/local/lib/python2.7/dist-packages/pyspider/libs/base_handler.py", line 148, in _run_func
return function(*arguments[:len(args) - 1])
File "<taobao>", line 20, in index_page
TypeError: 'NoneType' object has no attribute '
getitem_'

这是为何 是我做错了什么?
3603 次点击
所在节点    问与答
3 条回复
binux
2015-06-23 19:16:58 +08:00
无法复现
orzfly
2015-06-23 19:43:46 +08:00
实际跑 index_page 的时候,你用的数据可能是之前没加上 save 字段时 crawl 存进数据库的任务吧?每一个 crawl 都是存进数据库的,然后他的 callback 是稍后从数据库里读出来运行的。如果你存进数据库的时候 save 字段并没有值,那你后面运行到那条任务的时候自然是会出错的。

也许你需要清空一下任务数据库再来……
binux
2015-06-24 19:19:46 +08:00
@orzfly 有道理。。
在页面上调试的时候也是这样。运行到 Index_page 这一步的时候,task 已经生成了,这时候修改 on_start 的内容,并没有让 save 参数带入 task。
需要返回上一步 on_start,重新点击进入 index_page。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/200595

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX