抓取twitter中文用户数据GAE程序开源

2009-12-8

起源

我对抓取和处理数据挺感兴趣的,以前试过用PHP抓取饭否用户的数据,得出饭否用户统计(放在秘饭里),当时特别需要能有定时执行一个程序持续抓取数据的功能,但找不到方法,暑假发现GAE有cron功能时挺兴奋,就琢磨着要做个什么东西,抓取一些什么数据玩玩。可惜饭否挂了,否则我做的肯定是饭否的应用,饭否没了,就捣鼓twitter了。

想着想着,就想出抓取twitter上说中文的用户,形成一个排行榜,一个圈子,就是推特中文圈了,因为可以不断抓取数据,每个人最新的一条推都保存在数据库里,更新时间也保存,然后读取数据库,根据更新时间排序取出数据,就能形成的“随便看看”功能了。我最初想做的,就是这两个东西。实实在在的一个“中文圈”,后来闲着也是闲着,干脆把使用twitter需要的功能都加上了。没想到后来受欢迎的是这些普通功能,最初的那两个功能反响反倒不怎么样。另外,在中文圈发消息的时候,会自动更新存在GAE数据库里对应的用户数据,所以会马上显示在随便看看里。用的人多了,随便看看的更新就比单纯后台抓取数据快多了。

后来GAE版被封,改写PHP版,不愿放弃排行榜和随便看看,于是修改了程序,还是那样抓取数据,再提供个页面输出json数据,让php程序调用。

本来打算开源PHP版twitese后下一步就是要开源这个抓取数据提供API的GAE程序的,但一因为懒,二因为大家似乎没这个需求,就搁置了,今天偶尔想起来,就放上吧。

程序

项目主页:http://code.google.com/p/twiteseapi/

原理

读取FecthHelper数据库获得用户id和页码(第一次用下面写的initFetch页面写入初始数据),抓取他的好友列表,循环每一个用户,判断他的姓名、desecration、最新的推里有没有中文,有的话保存进TwitterUser数据库,没有的话跳过。一个页面的好友列表处理完后,判断此页是否为末页(根据好友个数是否小于一个数),不是末页则把下一页的页码写入FecthHelper数据库,等待下次执行。是末页则读取数据库TwitterUser里另一个用户的数据,存入FetchHelper,等待下次执行。

使用

在eclipse新建一个GAE项目,再把文件覆盖进去。改一下appengine-web.xml里的名字,剩下的就是提交上传了。

页面

4个功能页面:

initFetch页面,源文件InitFetchData.java
上传程序后首先运行这个页面,初始化生成FetchData数据库,写入当前要抓取的用户和页码。

fetch页面,源文件FetchData.java
核心页面,读取FetchData数据库取出用户名和页码,抓取它的好友列表,保存进数据库TwitterUser,按照不同条件判断继续下一页抓取还是改变抓取的用户。

reset页面,源文件ResetData.java
读取过的twitter用户在数据库里会标志readed=true,fetch抓取时间过长可能会导致所有用户readed都为true,这个页面每次修改100个用户的readed为false。

delete页面,源文件DeleteData。java
删除数据库TwitterUser里的数据,每次删除300条。

其中fetch reset delete都应该通过cron不断执行。

2个输出页面:

rank.json页面,源文件RankJson.java

输出排行榜数据,格式:

[{
    "profile_img_url": "http://……",
    "screen_name": "bang590",
    "name": "bang",
    "description": "",
    "followers_count": 1455053,
    "friends_count": 72,
    "statuses_count": 586
  },
  ……
]

接受参数:页码page 条数count 均为optional

browse.json,源文件BrowseJson.java
输出随便看看数据,格式:

[{
    "profile_img_url": "http://……",
    "screen_name": "bang590",
    "name": "bang",
    "text": "推内容",
    "created_at": "Tue Dec 08 15:15:50 UTC 2009",
    "id": 6465851422,
    "source": "web"
  },
  ……
]

接受参数:页码page 条数count 均为optional

目前存在的问题是,没判断API Rate limit,抓取时超过了API限制直接跳过了。
偶尔一些外国人的推里出现了中文,也会被抓取进数据库。程序写得很乱,没去整理,挺多地方有摇摇欲坠的感觉。不过上线运行了挺长时间,应该还算靠谱吧~

分类:作品 Tags:
评论

2009年12月8日 23:51

多谢了!

2009年12月9日 14:24

非常感谢开源分享!
PHP版twitese1.22回复点击后没有效果, 是不是相关JS代码有误?

2009年12月9日 14:26

此WP的主题也有问题啊.. 导航的首页链接写错了. 比如在本文章内点首页

2009年12月9日 15:52

@围玉 对 更新SVN 首页的链接修复了~

2009年12月10日 15:37

想弄个英文。。。

2009年12月12日 9:15

我用lua抓饭否的数据 呵呵

2009年12月12日 17:12

我又来支持博主了。呵呵。

2010年1月2日 20:28

咨询个问题,我用一个免费空间架设的好好的,但是换到我的收费空间之后就出现提示Fatal error: Call to undefined function: json_decode() in /homepages/2/d298277982/htdocs/T/lib/twitter.php on line 723
是什么原因呢??(看到你文章中提到了Json调用,所以来问下)

2010年1月2日 21:19

@枫飘彧嶺 因为你的收费空间不支持json_decode,下载最新版本的twitese试试

[…] 这次做的基本上跟原版一样,只是抓数据时不用page这个参数了,用cursor这个参数分页,发现这个参数用来抓取数据实在是比page方便多了。另外通过一些小伎俩解决了原本只能获取前1000个用户的问题,现在可以直接通过分页看到所有抓取到的用户了。具体抓取方法见这里,最后做了独立页面:http://twitese3.appspot.com/ […]

2010年5月30日 11:22

你好,我打算用这个程序做毕业论文的,可是在初期调试的时候出了很多问题,总也调不对,所以麻烦了。首先是文件始终执行不下去,我是用Eclipse调试的。你上面所说的覆盖我有试过直接copy的,还有workspace的文件夹里面全部删除掉然后添加的,可是后面运行的时候都说找不到文件,一个执行了index文件后就找不到了,一个直接就没有index出错了……还有就是后来我打算先上传到GAE上试试,可是无论怎么上传,都会反馈一个cron.xml文件和cron.xsd文件有冲突,甚至我把xsd文件删掉了还是会报这个错……
还有问一下我把这个改了做毕业设计的这件事情不知道你是不是允许,你要是介意的话我另外找了,该死的毕业设计能把人逼疯啊……O(∩_∩)O~

2010年5月30日 13:35

好吧 可是这问题可以麻烦指教一下吗?还是要解决的呀

2013年9月25日 12:08

Hi, I can not download your code from http://code.google.com/p/twiteseapi/, would you please check it?

2015年1月30日 21:22

楼主,能不能与你联系下。。有问题请教 ,谢谢。有QQ号码吗?或者回复邮件。