走近代码之Python-爬虫框架Pyspider

PySpider: 强大的网络爬虫系统,并自带有强大的webUI

1

框架特性

python 脚本控制,可以用任何你喜欢的html解析包(内置 pyquery)

WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出

支持 MySQL, MongoDB, SQLite

支持抓取 JavaScript 的页面

组件可替换,支持单机/分布式部署,支持 Docker 部署

强大的调度控制

2

可能遇到的问题

windows 下安装问题:http://docs.pyspider.org/en/latest/Frequently-Asked-Questions/#does-pyspider-work-with-windows

作者没有 windows 环境,没有对 windows 进行兼容性测试,所以在 windows 下运行的项目会有不可预知的风险,如果要使用 PySpider,建议在 linux 下开发运行

架构

ABOUT

模块

webui:web的可视化任务监控,web脚本编写,单步调试,异常捕获,log捕获,print捕获等

scheduler:任务优先级,周期定时任务,流量控制,基于时间周期或前链标签(例如更新时间)的重抓取调度

fetcher:用于拉取数据,其中涉及到phantomjs的拉取,使用代理来实现

processor:用于页面解析数据提取工作,这里提供如pyquery等选择器api

数据持久层database、result

信息传导层 massage_queue

数据处理流程

各个组件间使用消息队列连接,除了scheduler是单点的,fetcher 和 processor 都是可以多实例分布式部署的。scheduler 负责整体的调度控制

任务由 scheduler 发起调度,fetcher 抓取网页内容, processor 执行预先编写的python脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。

每个脚本可以灵活使用各种python库对页面进行解析,使用框架API控制下一步抓取动作,通过设置回调控制解析动作。

Demo源码分析

demo 地址:http://demo.pyspider.org/debug/douban_rent_lzh_sample

运行PySpider

在命令行输入,打开浏览器输入:http://localhost:5000,就可以进入pyspider的后台了

点击Create,输入爬虫项目名称,点击确定之后就进入一个脚本编辑器,可以开始编写爬虫代码

具体业务逻辑

主要模块

调度程序从两个不同的队列中获取任务(newtask_queue和status_queue),并把任务加入到另外一个队列out_queue,这个队列稍后会被抓取程序读取。

调度程序做的第一件事情是从数据库中加载所需要完成的所有的任务。之后,它开始一个无限循环。在这个循环中会调用几个方法:

主要有 tornado_fetcher.py 和 phantomjs_fetcher.js 两个文件。两种不同程序、不同语言之间的交互使用这种监视端口和请求的模型,能够最大程度降低耦合。

phantomjs_fetcher是在phantomjs上运行的脚本,负责监视固定端口请求,这样就可以接受来自fetcher的phantomjs_fetcher请求。

在phantomjs_fetcher里面,就使用了web_server_module,进行端口监听,使用page module请求,执行javaScript,然后封装好response返回给请求者

接收来自于fetcher的task,调用task内封装好的处理函数(callback),并将合适的进行输出(到result),其他的有后续任务的重新放入消息队列返回scheduler之中。

3

反爬虫策略

self.crawl 中增加 auto_crawl=True,并设置好间隔时间,比如 age=60*60 这样一个小时后,pyspdier会去自动抓取网页

修改 webui 中的 rate/burst,降低抓取频率

可以在 crawl_config 中增加 proxy

4

部署

因为pyspider 是有多个组件组成,所以你不仅可以启动标准的进程,你还可以使用第三方进程管理工作来单独管理组件甚至可以使用第三方的免费实例来运行。你也可以使用mysql或mongodb和RabbitMQ部署成集群。

命令行部署

tips:

使用 Docker 部署,参考文档:http://docs.pyspider.org/en/latest/Running-pyspider-with-Docker/

5

框架总结

上手简单,操作简便,因为它增加了 WEB 界面化的脚本编写、调试环境,写爬虫迅速

消息队列内置了 rabbitmq,redis 等,能够实现多实例分布式部署

PySpider可以在线提供爬虫服务,也就是所说的SaaS,想要做个简单的爬虫推荐使用它

自定义程度相对 scrapy 低,社区人数和文档都没有 scrapy 强

与 scrapy 相比,缺少一些有用的中间件处理

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180117G0FV1E00?refer=cp_1026

扫码关注云+社区