六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 820|回复: 0

面对twitter的网络爬虫的一些设计思路(1)

[复制链接]

升级  27.33%

21

主题

21

主题

21

主题

秀才

Rank: 2

积分
91
 楼主| 发表于 2013-1-30 00:56:20 | 显示全部楼层 |阅读模式
正在做关于twitter的数据挖掘的研究,先期需要获取一定量的数据,尝试做了一个小的爬虫。
几个碰到的问题和自己的解决思路,和大家交流一下,第一次先谈谈一些基本问题

1 由于众所皆知的原因,twitter不能直接访问

解决方法无外乎代理。笔者尝试过利用gae假设一个api的方法,但是速度并不理想,如今使用puff做代理直接访问,这个软件会在本机1984端口设立代理
基于httpclient的简单代码如下:
HttpClient client = new HttpClient();client.getHostConfiguration().setProxy("127.0.0.1", 1984);client.getParams().setAuthenticationPreemptive(true);

2 选择爬取对象

常规意义的爬虫是面对网页的爬取,不过twitter由于其api的开放性,完全可以面对api来做爬取。这样做的好处很多,不用抽取网页内容、每次请求的http包长度减小,当然,twitter对于api的使用是有一定限制的,官方文档里提及每小时只能请求150次,这个对于高性能的爬虫来说是一个很致命的缺点。对于这点,笔者打算采取分布式架构,从多个客户端去爬取信息,虽然每个爬虫的爬取速度受限,但数量多了,应该能满足要求。

3 获取好友列表


twitter官网的api文档给定了请求response的格式分为xml、json、rss三种,这里笔者选用了json。
对于单一用户的好友,有两种请求方法
http://twitter.com/statuses/friends.json?screen_name=xxx
http://twitter.com/statuses/friends/xxx.json?cursor=-1
前者请求前100个好友,返回jsonarray
而后者则采用分页方式请求,返回jsonobject,其中cursor是请求的起始标志位,在回复的json中会有next_cursor_str这一属性表示下一次分页请求的起始标志位,当这一属性为0,表示好友已经请求完了。

附上获取全部friends的简单代码

String pageString = "http://twitter.com/statuses/friends/xxx.json?cursor=";List<String> friendsList = new ArrayList<String>(200);private void getList(String str) {GetMethod get = new GetMethod(pageString + str);try {client.executeMethod(get);String responseString = get.getResponseBodyAsString();JSONObject object;JSONArray array;object = JSONObject.fromObject(responseString);array = object.getJSONArray("users");String crusor = object.getString("next_cursor_str");for (int i = 0; i < array.size(); i++) {object = array.getJSONObject(i);friendsList.add(object.getString("screen_name"));// System.out.println(object.getString("id"));}if (!crusor.equals("0")) {getList(crusor);}} catch (HttpException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
其中用到了json-lib这个json解析库,效率、便捷性方面都有缺陷,后期再找寻替代品。

4 获取特定好友的time_line

关于这个需求,api的基本限制是最多只能获取单一用户的前3200条twitter,当然对于以获取研究数据为目的的简单爬虫来说已经够用了。

基本请求格式为
http://twitter.com/statuses/user_timeline/xxx.json?page=x&count=x
其中count最多为200,没有标志位,但是可以通过用户状态获取用户的tweet总数,然后知道分页的信息。

简单获取用户time_line的代码
String stautsString = "http://twitter.com/statuses/user_timeline/xxx.json?count=x&page=x";private void getStauts() {GetMethod get = new GetMethod(stautsString);try {client.executeMethod(get);String responseString = get.getResponseBodyAsString();System.out.println(responseString);JSONObject object;JSONArray array;array = JSONArray.fromObject(responseString);System.out.println(array.size());for (int i = 0; i < array.size(); i++) {object = array.getJSONObject(i);System.out.println(object.getString("text"));}} catch (HttpException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表