PySpider踩坑记

PySpider

没有用过框架写爬虫,有人推荐了pyspider,我也没有和别的框架比对,就直接上手先用了。

使用感受

框架的封装性带来的优缺点在这里显示的淋漓精致...

优点

  • 爬虫该有的都有了——网站入口;分页查询;解析网页;保存数据(还可以发消息);
  • 爬取时间间隔设置;
  • 网页有效期维护;
  • 爬取多线程设置;
  • 对无头浏览器phantomjs的支持;
  • 支持web ui上调试代码,需求不高的情况下类似在线编写代码;
  • 提供了一键式获取css selector按钮,方便获取元素。

缺点

  • 本身不支持xpath方式解析;
  • 使用回调方式来运行pipline,框架把控回调的执行,不够灵活,多层爬取时需要递归方式调用index_page,导致代码可能比较混乱;
  • 提供的css selector提取器实用性一般,有一些复杂一点的拿不到;
  • 任务运行/关闭很多时候令人迷惑;
  • 对phantomjs的调用会对电脑cpu造成较大压力,据说是每次爬取都会启停一个phantomjs线程;
  • web ui没有删除任务的选项,也没有清空爬取到的数据的选项;
  • web ui的方式编码很费劲,我都是在IDE里面写好再复制上去;
  • web ui不能像本地IDE一样识别新加入的包。

版本:

pyspider v0.3.10
python 3.6.5

安装启动

参考官方Quick start可以很快上手: http://docs.pyspider.org/en/latest/Quickstart/

# 一键安装pyspider
pip install pyspider

# 会在当前目录下建立data文件夹,保存任务相关代码,数据,任务进度等,如果换了路径启动就找不到了
# 启动所有pyspider的组件,更多命令可以 pyspider help
pyspider all 

之后可以在 http://localhost:5000/ 看到启动了一个web ui,用来调试和运行pyspider的

框架机制补充

爬取

on_start并非只是个入口,pyspider之后要爬取url不会超过on_start执行的url的子集
换言之,不能爬取on_start的url的父路径。

多层次路径爬取

  • on_start只会执行一次,如果on_start中有循环调用crawl方法,则只会执行最后一条
  • index_page可以递归调用自身,可以使用这个特性来爬取多层路径

phantomjs

  • phantomjs 将其{phantomjs_home/bin}添加到环境变量path中即可,重启pyspider即可,注意要环境变量生效pyspider才能找到phantomjs。
  • 浏览器中能获取到的dom,pyspider获取不到,可能是需要设置phantomjs的调用

一些小特性

这里不一一罗列API了,主要讲我使用过程中碰到的一些特性

from pyspider.libs.base_handler import *


# pyspider的实现类需要继承BaseHandler,实现基本的几个接口
class Handler(BaseHandler):  
    # 放一些self.crawl函数请求页面时的http请求头:referer,user-agent等
    crawl_config = {
    }

    # pipline的起点,这里请求的url最好是下文请求的父级url,否则爬取不了,我出过这样的问题,不知道是不是就是这样的机制
    # 只会执行一次,即如果on_start中有循环self.crawl,只会执行最后一次
    @every(minutes=24 * 60)  # 任务运行之间的间隔,用来不停的补采过期的数据
    def on_start(self):  
        # 爬取网页的核心函数,支持phantomjs解析,需配置fetch_type='js'
        self.crawl('http://scrapy.org/', callback=self.index_page)

    #  理论上是爬取分页的,但是如果有多层爬取也得靠index_page,需要在self.crawl中设置callback为index_page,形成递归,当然如果逻辑不通,用if-else分开即可,如果有人发现了更好的多层爬取的方式,拜托告诉我一声...
    @config(age=10 * 24 * 60 * 60)  # 爬取结果的有效期
    def index_page(self, response):
        # response.doc得到一个pyquery对象,和操作一个jquery对象相似,相关api看pyquery官网即可
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)

    # 输出解析结果,如果用默认的sqlite,只能return一个dict,如果自己复写了on_result,就可以随意返回了
    @config(priority=2)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
        }

    # 自定义结果处理方式
    def on_result(self, result):
        ...
        # 处理结果
        ...

    # task结束时调用
    def on_finished(self, response, task):
        ...
        # 任务关闭时的操作,可以用来关数据库连接之类
        ...

启停任务

  • 在 localhost:5000 的web ui上修改状态即可
  • running和debug状态没有区别
  • rate/brust rate表示每秒爬取的网页个数可以为小数,这样可以放慢task调度,brust理解为并发数

其他

  • pyspider启动后在当前目录下生成data目录,project相关的数据,换目录启动会找不到之前的数据
  • pyspider自带了sqlite,但是要保存到别的数据库需要自己建连接,插入,关连接,相关的包自己导入后重启pyspider即可
  • project和task的信息在web-ui中不能修改,但是可以通过数据库工具打开data/{db_name}.db的文件,删除或者修改
  • 可以通过web ui的result页面的on_process项的内容做简单的debug
  • phantomjs的环境变量有一种可以立即生效的办法,不赘述啦
  • web ui中看似好的缩进可能是不合法的, 编辑器问题,复制出来格式化好了再粘贴回去

参考:

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,060评论 25 707
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,370评论 8 265
  • 我曾因你一句 无心的承诺 熬红了双眼 却换来你无情的背影 2016.9.16
    橙子_Lin阅读 264评论 0 0
  • 最近因为加入一个新的团队,才开始认真的关注关于编写高质量代码的话题,学习总结的同时,记录下这段让自己再一次认真学习...
    JavaQ阅读 606评论 1 3
  • 序 人---作为一种群居动物,根据“能量级”的不同,逐渐形成了圈子。 圈子,就像围城,里面和外面有着明显的界限。 ...
    圣掿凡阅读 284评论 0 0