chineking edited this page Dec 10, 2014 · 35 revisions

Cola

Cola是一个分布式的爬虫框架,用户只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。

依赖

首先,确保Python版本为2.6或者2.7(未来会支持3+)。由于Cola配置文件使用的yaml,所以Cola只依赖于pyyaml,安装easy_install或者pip工具后,则可以:

pip install pyyaml

安装

下载或者用git clone源码(如果只使用单机版本,推荐使用develop分支,不久后会合并到master分支),假设在目录/to/pth/cola,将该路径添加到Python path中。

一种简单的方法是在site-packages中添加pth文件。site-packages因系统而异,如果是windows,假设python装在C:\python27,那么就是C:\python27\Lib\site-packages;如果是linux,那么应该是/usr/local/lib/pythonX.X/dist-packages。

在site-packages下新建一个cola.pth文件,里面写上路径:/to/path/cola。

运行

Cola集群需要一个master和若干个worker,对于每台机器,只能启动一个worker。但是,集群不是必须的,在单机模式下亦可以运行。

Cola目前自带了若干个爬虫,在项目根目录下的contrib中。

下面就wiki为例,分别说明如何在单机和分布式环境下运行。

依赖

无论是维基百科还是新浪微博的实现,数据都存放在MongoDB中,所以要确保MongoDB的安装。

在wiki下的wiki.yaml和weibo下的weibo.yaml中可以配置MongoDB的主机和端口。

维基百科和新浪微博实现依赖于下面的几个包:

  • mechanize
  • python-dateutil
  • BeautifulSoup4
  • mongoengine
  • rsa(仅新浪微博需要)

可以使用pip或者easy_install来安装。

单机模式

单机模式非常简单,只需运行contrib/wiki/__init__.py即可。

cd /to/path/cola/contrib/wiki
python __init__.py

要运行新浪微博的爬虫,需要在weibo.yaml中配置登录的用户名和密码。这里要注意,要保证这个用户名和密码在登录时不需要验证码。

停止则需运行stop.py(develop分支直接CTRL+C退出),注意不能通过直接杀死进程来停止,否则会导致cola非法关闭。 如果非法关闭,确保cola不在运行的情况下,则可以运行stop.py来恢复。但无论如何,都不推荐非法关闭,否则可能遇到不可预知的错误。

python stop.py

分布式模式

首先需要启动cola master和cola workers。分别运行根目录下bin中的start_master.py和start_worker.py

启动cola master:

cd /to/path/cola
python bin/start_master.py --data /my/path/data

如果不指定--data,那么数据文件会放置在项目根目录下的data文件夹中。

启动cola worker:

python bin/start_worker.py --master <master ip address> --data /my/path/data

--data选项同master。如果不指定master,会询问是否连接到本机master,输入yes连接。

最后使用bin下的coca.py来运行指定的Cola job:

python bin/coca.py -m <master ip address> -runLocalJob /to/path/cola/contrib/wiki

-runLocalJob选项是要运行的job所在文件夹的绝对路径。输入命令后,该job会被提交到Cola集群来运行。

停止Cola Job或集群

停止整个集群,则可以运行:

python bin/coca.py -m <master ip address> -stopAll

而停止一个Job,则需要查询得到Job的名称:

python bin/coca.py -m <master ip address> -showRunningJobsNames

得到名称后,再运行:

python bin/coca.py -m <master ip address> -stopRunningJobByName <job name>

基于Cola实现的爬虫

基于Cola实现的爬虫位于contrib/目录下。目前实现了四个爬虫:

  • wiki:维基百科。
  • weibo:新浪微博爬虫。从初始用户出发,然后是其关注和粉丝,依次类推,抓取指定个数的新浪微博用户的微博、个人信息、关注和粉丝。其中,用户微博只获取了内容、赞的个数、转发和评论的个数等等,而没有具体去获取此微博被转发和评论的内容。
  • generic(unstable):通用爬虫,只需配置,而无需修改代码。目前Cola实现了一个抽取器(cola/core/extractor),能够从网页正文中自动抽取主要内容,即去除类似边栏和底脚等内容。但是,此抽取器目前准确度还不够,效率也不够高,所以需要谨慎使用。
  • weibosearch(unstable):新浪微博搜索的爬虫。这个爬虫使用cola.core.opener.SpynnerOpener,基于spynner实现了一个Opener能够执行JavaScript和Ajax代码。目前这个爬虫存在的问题是:新浪微博可能会将其识别成机器人,因此有可能会让输入验证码。

wiki和weibo之前有所提及。主要说明generic和weibosearch。

对于generic来说,主要要修改的就是配置文件:

job:
  patterns:
    - regex: http://blog.sina.com.cn/$
      name: home
      store: no
      extract: no
    - regex: http://blog.sina.com.cn/s/blog_.+
      name: article
      store: yes
      extract: yes

其中,regex表示要匹配的url的正则表达式;name是正则匹配的名称;store为yes时是存储这个网页,no为不存储;extract表示是否自动抽取网页正文,只有当store为yes的时候,extract才有作用。

对于weibosearch,其使用了spynner来执行JavaScript和Ajax代码。所以需要确保以下依赖的安装:

如果你觉得可以基于cola实现一个比较通用的第三方爬虫,比如说腾讯微博等等,欢迎将此爬虫提交到contrib/中。

编写自定义Cola Job

见wiki编写自定义Cola Job

架构和原理

cola

在Cola集群里,当一个任务被提交的时候,Cola Master和Worker会分别启动JobMaster和JobWorker。对于一个Cola Job,当JobWorker启动完成后,会通知JobMaster,JobMaster等待所有JobWorker启动完成后开始运行Job。在一个Cola Job启动时,会启动一个消息队列(Message Queue,主要操作是put和get,worker抓取到的对象会被put到队列中,而要抓取新的对象时,只要从队列中取即可),每个JobWorker上都存在消息队列节点,同时会有一个去重模块(bloom filter实现)。

问题

Cola还不够稳定,目前会处于持续改进的状态。且Cola还没有在较大规模的集群上测试,但是接下来我会把Cola应用到新项目中,并逐步完善。也希望大家也能给我反馈,并帮助改进。

Roadmap

0.1版本计划:

  • 完善功能(目前需要完成coca命令行工具)
  • 完成setup脚本并上传至pypi,支持easy_install或者pip安装
  • 将contrib/weibo和contrib/wiki移动至app目录,原有的contrib目录将用来放第三方组件;将contrib/generic和contrib/weibosearch移至lab目录。
  • 在doc目录下用sphinx写文档,并托管到readthedocs.org
  • dockerfile

0.2版本计划:

  • 实现一个web接口(命名pepsi),可以查看运行的cola job以及运行情况,并可创建job。
  • app下实现知乎的抓取。
  • 实现下载器(downloader,支持断点下载),实现豆瓣音乐抓取。

0.3版本计划:

  • 用zookeeper来master election,以及同步配置
  • 实现第三方组件,包括基于Redis或者MongoDB的去重模块,以及各种基于第三方工具的消息队列。

0.4版本计划:

  • 提升cola/core/extractor的性能和精确度,重新实现lab/weibosearch,lab下功能稳定移动到app下。
  • 增加一个统一持久化抽象,支持保存到关系型数据库,MongoDB,文件系统,HDFS等等。

1.0版本计划:

  • 支持Python 3+

捐赠

支付宝

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.