pyspider脚本编写指南
project
脚本分为不同的 project,不同的 project 之间的任务互相独立,建议为不同的站点建立不同的 project
project 属性
group – 分组标识,暂时仅用于区分
name – 脚本的名字,只允许 a-zA-Z0-9_
status – 任务状态,只有处于 DEBUG 和 RUNNING 状态任务才会被执行
rate – 每秒抓取页面个数
burst – 并发数
status – 任务状态
TODO – 新建立的脚本所处的状态
STOP – 停止
CHECKING – 当任务在 DEBUG 或 RUNNING 状态被修改时,会自动变为 CHECKING,暂停任务执行
DEBUG – 任务可以开始执行,handler的 __env__[‘debug’] == True
RUNNING – 任务正常执行状态
task
任务是 spider 调度的最小单位。
taskid 是任务的唯一区分标识,默认使用 url 的 md5 作为 taskid(即根据 url 对抓取去重)
不同 project 间任务相互独立(不同 project 间 taskid 可以相同)
任务状态
active(1) – 活动状态,表示任务在队列中等待被抓取(包括在队列中、抓取中、执行时间未到、重试中)
success(2) – 抓取成功状态
failed(3) – 经过重试后抓取失败
bad(4) – 损坏,暂未使用
任务调度
只有处于 active 状态的任务才会得到调度,scheduler 对于每个 project 有两个队列:
时间队列 – 任务尚未到达执行时间,时间拉长重试也在这个队列中
优先队列 – 任务已经到达执行时间,任务会根据优先级 priority ,在有流量配额情况下,依次发起调度
scheduler 会等待每一个调度任务返回,当执行失败时,会根据 retries 参数,拉长一定时间发起重试。当超时结果未返回时,会无限次地重新发起调度
新/旧任务请求
当产生一个库中没有的任务请求时,会根据参数 exetime 中设定的执行时间决定是放入 时间队列 还是 优先队列。
当新请求已经在队列中(即任务状态是 active 时),会忽略新的请求,即使它们的参数不一致。