Pyspider简单入门

安装###

<p>python 2.7
pip install --allow-all-external -r requirements.txt

如果你使用 ubuntu,依赖以下二进制包:apt-get install python python-dev python-distribute python-pip libcurl4-openssl-dev libxml2-dev libxslt1-dev python-lxml

启动 : pyspider all
脚本编辑:on_start 是脚本执行的入口, 点击run 会被调用
@every 表示这个任务是定时执行
self.crawl: 用于控制抓取连接, 使用callback = self.index_page指定用哪个函数解析抓取到的页面
def index_page(self, response) : 回调函数可以通过访问response 访问抓取到的数据, return的内容会被采集到resultdb中。 重载 on_result(self.result) 函数可以修改中国行为
Run: 可以通过run 测试脚本

Project###

project 属性
status – 任务状态,只有处于 DEBUGRUNNING 状态任务才会被执行
TODO – 新建立的脚本所处的状态
STOP – 停止
CHECKING – 当任务在 DEBUGRUNNING 状态被修改时,会自动变为 CHECKING,暂停任务执行
DEBUG – 任务可以开始执行,handler的 __env__['debug'] == True
RUNNING – 任务正常执行状态
rate – 每秒抓取页面个数
burst– 并发数

take###

任务是 spider 调度的最小单位。
taskid 是任务的唯一区分标识,默认使用 urlmd5 作为 taskid(即根据 url 对抓取去重)
不同 project 间任务相互独立(不同 projecttaskid 可以相同)
任务状态
active(1) – 活动状态,表示任务在队列中等待被抓取(包括在队列中、抓取中、执行时间未到、重试中)
success(2) – 抓取成功状态
failed(3) – 经过重试后抓取失败
bad(4)– 损坏,暂未使用

任务调度###

只有处于 active 状态的任务才会得到调度,scheduler 对于每个 project 有两个队列:
时间队列 – 任务尚未到达执行时间,时间拉长重试也在这个队列中

优先队列 – 任务已经到达执行时间,任务会根据优先级 priority
在有流量配额情况下,依次发起调度

scheduler 会等待每一个调度任务返回,当执行失败时,会根据 retries
参数,拉长一定时间发起重试。当超时结果未返回时,会无限次地重新发起调度
新/旧任务请求
当产生一个库中没有的任务请求时,会根据参数 exetime
中设定的执行时间决定是放入 时间队列 还是 优先队列。

当新请求已经在队列中(即任务状态是 active 时),会忽略新的请求,即使它们的参数不一致。
可以通过 force_update
参数强制更新处于 active 状态的任务

当任务状态是 successfailed。参数 age
会检测 上次抓取时间 + age
是否大于当前时间,若大于,则会重启任务。或者,您可以通过设置itag
(例如前链中提取的更新时间)参数,当本次请求的 itag
与上次不同时,会重启任务。

script###

执行环境
环境变量
``project == self.project:当前任务信息self.project_name:当前脚本名self.response:当前请求的responseself.task: 当前请求的原始task信息logginglogger,print的信息会被采集,请使用logger`:打印日志(默认 logging 已经 import 到环境中,请不要再次导入)

脚本约束###

接口请从 from libs.base_handler import *中导入
脚本必须有至少一个的继承自 BaseHandler 的类
例外:当环境中有多个继承自 BaseHandler
(例如:二次派生时),请指定 __class__ = Handler

每个 task 由参数 callback指定的成员函数解析(默认的 callback__call__
完整的 callback 函数原型是:def foo(self, response, task)(可以忽略您不需要的参数(但需要顺序一致)例如:foo(self, res)

response 是一个抓取结果的对象
task 是原始的请求 json,和您在 调试器 左侧 绿色区域 看到的结果一致

函数的返回内容会被 on_result(self, result)
函数捕获,您可以在这里将其输出到数据库中

API接口###

特殊接口
def on_start(self):当在首页上点击 project 的 run按钮时被调用
def on_result(self, result):所有 callback 函数 return 时被调用(包括返回值为 None 时)。默认的 on_result
回调会将结果发送给 result_work,默认的 result_work 会将结果储存到 resultdb 中。如果覆盖这个方法,会阻止默认行为。使用super(Handler, self).on_result(result)
调用父类方法以将结果发送给 result_worker
def on_message(self, project, message):当收到其他 project 发送的消息时被调用,project 为发送消息的 project 的名字,message 可能为任意类型。使用 send_message
发送消息。

module方法
@config(**kwargs)修饰回调函数,给 self.crawl 接口设定 function 级默认值
@every(minutes, seconds)修饰 on_cronjob 回调函数,每 minutes分钟执行
@catch_status_code_error修饰回调函数,回调函数接受抓取异常数据。默认的 callback 会直接对非200返回直接抛出异常。
@not_send_status修饰回调函数,回调函数不发送状态包给 scheduler,不建议使用.

类成员变量
crawl_config:dictself.crawl 接口设定 class 级默认值方法
BaseHandler.crawl(url, **kwargs)参数列表,以下参数,除了 url 都是可选的。您可以使用 crawl_config
和/或 @config(_config:dict)
给类或方法设定默认值。但 直接调用的优先级 高于 方法级默认值 高于 类默认值。修改默认值不会影响已经创建了的任务。

基本

url – 需要抓取的url,支持url数组,支持dataurl:data:,content

当有params参数存在时,最终url为拼接后的> 当url中有中文时,会进行 % 编码

taskid – 默认取 url 的 md5
callback – 回调函数,可以是 self.foo也可以是函数的名字 "foo",默认__call__
save – 传递给下一个请求的数据,可以是任何可 json 的对象

调度
priority – 调度优先级,越高越好
retries – 重试次数
exetime – 执行时间,为 time.time() 的 timestamp
age – 页面有效期,在有效期内抓取过的页面不会重新抓取
itag – 能反映页面最后更新时间的标记,一般取自最后更新时间


抓取
method – POST/GET/HEAD 等
params – url中 ?a=b 的部分,类型 dict
data – POST正文的内容,string 或 dict > GET有data可能会导致抓取失败
files – 上传文件,{'key': ('file.name': 'content')}
headers – 请球头,类型dict
cookies – 请求的 Cookies,类型 dict
timeout – 请求超时
allow_redirects – 是否跟随30x跳转,默认 True
proxy – 是否使用代理抓取,默认 True(需要 fetcher 支持)
etag – 是否启用etag(当页面无变化时不会抓取内容,也不会触发解析)
last_modifed – 是否启用last_modifed(当页面无变化时不会抓取内容,也不会触发解析)


使用JS渲染##

fetch_type – 设置为 phantomjs或js时,调用 phantomjs 进行js渲染,加载 ajax 内容。需要安装 phantomjs,并为 fetcher 设置 phantomjs_proxy。
js_script – 设置一段 JS 脚本,在页面加载完成(前)时执行。进行模拟点击等动作。
js_run_at – document-start/document-end
load_images – 开启图片,默认关闭。

BaseHandler.send_message(project, msg, [url])向其他 project 发送 msg,对方脚本可以通过 on_message
回调获得消息。默认的 url 是固定的,在on_message中发往 on_result 的数据会相互覆盖,使用 url 参数为每个结果设置不同的 URL地址(例如:http://example.com/page3.html#result-1

Response
source: libs/response.py
属性
Response.status_code请求返回的状态码
Response.url请求的url(当发生跳转时,为跳转后的url)
Response.orig_url原请求的url
Response.headers返回头
Response.cookies返回的cookies
Response.error请求错误信息,string类型
Response.time请求用时
Response.ok请求是否成功
Response.encoding页面的编码,会根据header,content自动检测;当检测错误时,可以手动设定编码覆盖
Response.text页面经过转码成为 unicode 的数据
Response.content页面未转码内容
Response.save从上一个任务中传下来的数据
Response.json尝试解析 json
Response.doc将页面建树,返回一个 pyquery 对象(已将相对地址转为绝对地址 make_links_absolute

方法
Response.raise_for_status()尝试抛出抓取异常
FAQ
如何删除一个任务
将任务的 group 设置为 delete ,并将状态设置为 STOP,没有更新 24小时 之后,scheduler 会自动删除任务。

执行任务###

  1. 点击脚本的status , 修改为DEBUGRUNNING
    <i>任务状态会影响是否执行抓取。当你修改过脚本后,任务状态会自动变为 CHECKING.</i>
    2 . 确认 rate/burst 都不为0
    <i>rate 用于控制每秒抓取页面的个数,burst 可以视为并发控制。</i>
    3.执行Run
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容