Python中pyspider的on_message方法如何获取返回结果
在处理一个页面返回多个结果的任务中,使用 send_message 和 on_message 方法,但是 on_message 方法得到并且 return msg 之后如何进一步处理,我想要进一步在 on_result 中做一些处理,但是 on_result 获取不到 on_message 返回的结果。谢谢!
Python中pyspider的on_message方法如何获取返回结果
2 回复
在pyspider里,on_message方法默认不直接返回结果给调用方。它是框架内部用于处理消息的钩子。如果你想让爬虫任务返回结果,通常不是通过on_message,而是通过回调函数或者直接return。
不过,如果你确实需要在on_message里处理数据并让外部获取,一个常见的做法是设置一个实例变量来存储结果。下面是一个典型用法的代码示例:
import pyspider
from pyspider.libs.base_handler import *
class MyHandler(BaseHandler):
def __init__(self):
self.result = None # 用于存储结果的变量
def on_message(self, project, task, message):
"""
处理消息,并将需要的结果保存到实例变量中。
"""
# 假设message是字典,包含我们需要的'data'字段
if message.get('type') == 'data':
self.result = message.get('data')
# 可以在这里进行一些处理
processed_data = self._process_data(self.result)
return processed_data # 这个返回值通常是给框架内部用的
return None
def _process_data(self, data):
"""一个简单的数据处理示例"""
# 这里写你的处理逻辑,例如:
if data:
return {'status': 'success', 'processed': data.upper()}
return {'status': 'error', 'processed': None}
@every(minutes=24 * 60)
def on_start(self):
# 启动任务,这里模拟发送一个消息
self.crawl('http://example.com', callback=self.index_page)
def index_page(self, response):
# 页面解析,构造一个消息
data_to_send = {'type': 'data', 'data': 'some raw data from page'}
# 使用self.send_message给同一个project发送消息
self.send_message(project='your_project_name', task=response.task, message=data_to_send)
# 如何从外部获取结果?
if __name__ == '__main__':
handler = MyHandler()
# 注意:在实际pyspider运行中,handler实例是由框架创建和管理的。
# 你无法像这样简单地从外部访问。以下代码仅为说明逻辑。
# 通常,你是在另一个地方(如监控脚本)通过pyspider的API或数据库来获取任务结果。
# pyspider会将任务结果(包括on_message处理后的返回)保存到结果队列或数据库中。
# 你需要配置项目的`result_worker`和`result_db`来持久化结果。
print("结果通常通过配置的结果后端(如MySQL、MongoDB)获取,而不是直接从handler实例读取。")
核心要点:
on_message的返回值:它返回的值会被框架用于内部处理(例如,可能用于更新任务状态),但并不是直接返回给启动任务的那个调用方。- 获取结果的常规途径:在pyspider中,爬取的结果(包括
on_message处理后的数据)通常通过配置结果后端(Result Worker) 来获取。你需要在项目配置中设置result_db(例如连接到MySQL、MongoDB或Redis),任务产生的最终结果会被保存到那里。然后你可以写单独的脚本从数据库里读取结果。 - 代码中的
self.result:在上面的例子中,我们将结果存到了self.result。这在单个handler实例内部传递数据是可行的,但pyspider是分布式架构,handler实例可能在不同进程甚至不同机器上运行,且生命周期短暂。因此,这个变量在分布式环境下不是可靠的共享状态。它主要用于当前任务链中的临时传递。
所以,直接回答你的问题:on_message方法本身不提供将结果直接返回给初始调用者的机制。你需要通过配置结果持久化(如数据库)来获取任务的最终输出。
一句话总结:配好result_db从数据库拿结果,别直接从on_message返回值里取。
return 就行了啊

