aobom
分布式新浪微博爬虫
To view document of English version, refer to homepage of this project.
aobom是用Python编码的一个分布式爬虫,您可以利用aobom可以通过新浪微博开放平台API下载TB级的微博数据。
aobom适用于
- 你想要下载新浪微博数据时;
- 你想要通过API下载Facebook, Twitter, 人人, 豆瓣等SNS站点的数据;
- 尽管爬虫的运行和结构都很简单,你应该对Python有基本的了解。
aobom的优势
- 零配置: 只需要Python作为运行环境(如果你愿意,也可以在服务器端使用MySQL作为数据服务,否则默认使用无需任何安装配置的Python内嵌SQLite)。
- 动态资源管理:把Token、任务列表部署在服务器节点上,aobom会自动进行动态调度资源。
- 提供便捷的状态监视:aobom允许您通过自己的浏览器来查看爬虫在各个节点上运行的状态。
- 小巧: 仅仅198 KBs python 代码,位于26个代码文件, 5个包.
- 简易: 在所有的代码当中,有2个代码文件(137 KBs)是第三方独立模块,aobom的客户端和服务器上部署的代码完全相同。
- 易扩展-功能: 只要简单修改,aobom就能让您下载其他类别的新浪微博或其他平台的数据。
- 可扩展-规模: aobom可以以单点模式,或分布式模式运行,您可以轻易在众多节点上以分布式方式运行aobom,aobom也支持您以MySQL作为服务器端后台数据库。
- 平台独立: (理论上)aobom可以运行在任何支持Python 2.7.x的操作系统上,例如WinXP、CentOS、Mac等等。
架构
- aobom可以以单点模式执行数据加载,也可以以集群方式运行,完成更大规模的数据下载。
- 在集群模式下,aobom需要一台服务器节点来进行资源和任务的调度,以及不少于两台机器作为从节点进行数据的下载工作。
- 为了方便,爬虫各个节点之间的通讯以Json的数据格式通过HTTP进行传输。
- 客户端和服务器端都使用SQLite来存储资源和任务数据。
- 如果你愿意,服务器端也可以使用MySQL作为后台数据库,但是您需要下载安装mysql.connector模块。
- 在每个任务节点(集群模式下的从节点和单机模式的单机节点)上,aobom开启N个线程进行下载,N = Tokens数 * 任务种类数。
- 默认情况下,aobom把下载的数据以JSON的形式作为文本文件进行存储,但是您可以轻易地把数据存储到其他数据存储媒介当中,例如mysql, mogngo, hbase等。
- aobom的任务模块扩展简便,通过简单的接口,就可以下载不同类别的数据,或者将数据存储至其他存储媒介。
- aobom的各个节点之间的通讯,以及监视接口的提供,利用了bottle程序包(提供HTTP服务)。
使用前须知
- 在使用之前,您需要对新浪微博开放平台的API有所了解,并且清楚地知道Token的概念和使用。
- 明确如何获得Token,知道Token的有效期。
- 希望您了解新浪微博API是如何通过HTTP工作的,并且知道当偶尔的请求失败后,应当如何应对。
- 准备好足够的Token,放在一个文本文件当中,要求每行一个Token字符串,不留空行。
- 准备好要下载的任务的ID列表,放在一个文本文件中,每行一个ID,不留空行。ID一般是用户的UID,当然,也可以是其他形式,比如微博状态的MID。
- 明确您是要通过新浪微博开放平台下载什么数据。
最佳实践
- 根据新浪微博API的限制策略,您应该:
a) 将不同的aobom从节点(工作节点),运行在具有独立外网IP的主机上。换言之,使用NAT的网络环境,如果各主机有相同的外网IP,会影响集群的下载性能。
b) 提供并及时更新Token,使得工作节点上的爬虫进程可以正常高效地下载数据。 - 在我们的实践当中:
a) 我们把下载的数据文件以JSON文本文件的形式进行备份存储,然后再把这些JSON文本文件,载入到其他数据库中,便于程序分析。
b) 我们建立多台虚拟机来运行从节点,这些虚拟机有着独立的公网IP地址。
c) 我们将NFS(Network File System)挂载到虚拟机上,数据直接存储到NFS上,这样就不再需要从VHD上进行数据移动。 - 我们不建议您直接把下载的数据存储到本地数据库中,还是留一个通用格式的备份更为稳妥。
限制和不足
- aobom目前只支持Python 2.7.x,不支持Python 3.x。这是因为aobom使用的部分第三方库(Weibo SDK)目前还只支持Python 2.7。
- aobom使用的是新浪微博API,而不是直接从网页爬取,因此,您需要有效的Token才能开展微博数据下载。
- 由于sqlite的设计只支持单连接,因此程序中要使用线程锁来保障临界资源的正常使用,因此,爬虫的性能可能受到轻微影响。
如何开始使用aobom?
- 如“使用前须知”所述,准备好您的Token文件和任务文件。
- 我们建议您先尝试使用一下aobom的单机工作模式,以对aobom的运行有个初步的了解。
- 要以单机模式运行,打开一个命令行(Linux下的bash或Windows下的cmd),然后在aobom的根目录下,输入
python main.py
。 - 根据程序的提示,载入Token和任务。当您要加载任务时,需要定义任务的工作模式,我们为您准备了两个示例,'UserProfile'和'UserStatus',分别代表下载用户的个人资料和所有微博(因新浪微博API限制,最多抓取2000条微博),加载任务的时候,您就需要渐入UserProfile或UserStatus作为任务名称。
- 当您要在集群模式下运行aobom时,通过
python main.py -m master -p XXXX
来启动服务器节点,其中XXXX是用于通讯和监视的端口号,如果您想用MySQL作为服务器数据库,再加上“-d mysql”(需要在config.py中设置连接参数)。 - 当您启动好服务器节点后,您应该载入Token和任务,否则从节点将不会工作。
- 要启动一个从节点,运行
python main.py -m slave -p YYYY -u http://MASTER_URL:XXXX
,其中MASTER_URL是服务器节点的IP地址, XXXX是上面提到的服务器运行的端口号,YYYY是从节点运行进行通信和提供监视的端口(建议各个从节点的YYYY相同,便于您管理,虽然程序通信没有这样的要求)。 - 当aobom的节点启动后(不管是单机模式,还是集群模式下的服务器、从节点),您就可以通过您的浏览器(当然要在能够和这些节点进行通讯的主机上),打开下面的地址,来查看节点的运行状况:http://IP_ADDRESS:PORT/, http://IP_ADDRESS:PORT/info,http://IP_ADDRESS:PORT/stat,其中IP_ADDRESS是节点的IP地址,PORT是节点用于通信和监视的端口。
(可能的)常见问题 FAQs
- 为什么这个程序叫做aobom?
这是我的第一个开源项目,所以选取了一个以字母A开头的单词。 - 你用aobom下载过数据吗?
当然!在单机模式下,我们用aobom完成了几十GB的数据下载,我们目前也正在集群模式下,下载TB界别的数据。自然,下载这么多的数据,需要很多的Token、独立IP等资源,我们下载的时候,在服务器端使用了MySQL作为后台数据库,尽管要把上亿的任务数据导入到MySQL当中是十分费时的,要两三个小时(但是把4亿个ID导入SQLite数据文件,就需要整整一天)。 - 如何获取新浪微博API的Token?
我不愿意把“无可奉告”作为回答,不过您应该有一个靠谱的新浪微博APP,有一些用户为这个APP提供了有效授权。如果没有那么多用户?自己动手,丰衣足食吧。 - 为什么aobom要使用JSON数据格式通过HTTP进行通讯,而不是使用sockets呢?
为了简单,尤其是可以利用这种方式提供用户监视接口。 - aobom没有图形界面吗?
aobom有图形界面~ 您可以通过一个PC上的浏览器查看各个节点的运行状况,具体方法参见“如何开始使用aobom”,通过浏览器查看格式化好的JSON字符串总好过到各个节点上去看命令行。至于您使用MySQL作为数据库的话,还是通过mysql的shell来完成数据导入吧。
深入aobom
- 如果扩展aobom来下载其他类别(也就是UserProfile、UserStatus之外)的微博数据?
- 在task包当中,编写完成您自己的任务类,您可以参照其他的例子,比如UserProfile。您的类必须遵照下面的规定:a) 这个任务类必须要继承TaskBase类;
b) 设定好一个任务的名字,参照UserProfile,比如您的任务叫做XxxYyy,那么这个类必须命名为TaskXxxYyy,在这个类中,需要定义一个成员变量,self.name='XxxYyy';
c) 存储这个类的Python文件必须命名为xxxyyy.py,即任务名称的小写字母; - 在config.py文件中,在tasks这个列表变量中,加入一个str元素'XxxYyy'。
- 在task包当中,编写完成您自己的任务类,您可以参照其他的例子,比如UserProfile。您的类必须遵照下面的规定:a) 这个任务类必须要继承TaskBase类;
- 应该如何修改aobom来使之可以下载其他网站的数据?
我们建议您有那个网站的API的Python SDK,这会使问题变得简单很多。您需要修改: [(slave.error.py文件: 处理SDK产生的错误), (slave.crawler: 重新定义您的网站的SDK), (在task包中: 编写定义通过调用SDK和存储函数完成下载任务的任务类,如上一个问题所述.)]
告知与致谢
- 本项目由计算网络心理实验室(CCPL)成员 郝碧波 开发并开源。作者向 李琳 致谢,他开发的C#微博爬虫为本项目的开发提供了必要的支持。
- 如果您使用aobom下载手机数据来完成一项学术研究并发表了出版物,请您在出版物中引用一下本项目的GitHub主页。
- 如果您利用aobom下载数据来进行任何学术研究,作者都十分希望了解您的研究,分享您在研究中的快乐,欢迎您通过下面的方式联系作者。
如果您想要…
- 报告Bug或者参与到项目当中:您可以folks项目并进行您自己的开发,报告bug的话可以通过GitHub报告issue。
- 了解项目作者的更多信息:您可以查看他的简历 或者到新浪微博关注他@Peter_Howe。