本篇将从实际例子出发,展示如何使用api爬取twitter的数据。


1. 创建APP

进入https://apps.twitter.com/,创建自己的app。只有有了app才可以访问twitter的api并抓取数据。只需创建最简单的app即可,各种信息随意填写,并不需要进一步的认证,我们要的只是app的Consumer Key (API Key), Consumer Secret (API Secret), Access Token 和 Access Token Secret。鉴于单app的爬取次数限制,可以申请很多app来提高总次数。


2. 确定要使用的API

twitter提供多种类型的api,其中常用的有REST APIStreaming API。前者是常见的api类型,后者则可以跟踪监视一个用户或者一个话题。

REST API下面有很多的api,有价值爬取的有以下几个:

  • GET statuses/user_timeline:返回一个用户发的推文。注意twitter里回复也相当于发推文。
  • GET friends/ids:返回一个用户的followees。
  • GET followers/ids:返回一个用户的followers。
  • GET users/show:返回一个用户的信息。

3. 官方类库

下载twitter的类库。说实话,api爬虫好不好写,全看类库提供的功能强不强。twitter提供了多种语言的类库,本文选择java类库。


4. 验证授权

凡是访问api,都需要验证授权,也即:OAuth。一般流程为:以app的id和key,用户的用户名和密码为参数访问授权api,返回一个token(一个字符串),即算是授权完成,之后只需访问其他api时带上这个参数就行了。

当然,不同的网站授权过程各有不同。较为繁琐的比如人人网需要先跳转至回调网页,用户登陆后再返回token。twitter的授权过程也不简单(需要多次http请求),但是幸运的是类库中已经帮我们实现了此过程。

例,twitter的Auth1.1授权,其中需要设置的四个参数在app管理界面就能看到:

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthAccessToken(accessToken);
cb.setOAuthAccessTokenSecret(accessTokenSecret);
cb.setOAuthConsumerKey(consumerKey);
cb.setOAuthConsumerSecret(consumerSecret);
OAuthAuthorization auth = new OAuthAuthorization(cb.build());
Twitter twitter = new TwitterFactory().getInstance(auth);

twitter还提供一种无需用户授权(需app授权)的选择,访问某些api时可用次数比Auth1.1授权的要多:

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setApplicationOnlyAuthEnabled(true);
Twitter twitter = new TwitterFactory(cb.build()).getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
try {
twitter.getOAuth2Token();
} catch (TwitterException e) {
e.printStackTrace();
}

5. 调用API

授权之后,我们就可以真正地开始爬数据了。

  1. REST API

爬取用户follower,getFollowersIDs方法每次返回最多5000个follower,cursor用户标记从哪开始:

IDs iDs = twitter.getFollowersIDs(uid, cursor);

爬取用户推文:

ResponseList<Status> status = twitter.getUserTimeline(uid, page);
  1. Streaming API

监视一个用户的所有行为,其中UserStreamListener太长了只截取了一部分:

TwitterStream twitterStream;
twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
twitterStream.addListener(listener);
twitterStream.user(); private static final UserStreamListener listener = new UserStreamListener() {
@Override
public void onStatus(Status status) {
System.out.println("onStatus @" + status.getUser().getScreenName() + " - " + status.getText() + status.getCreatedAt());
} @Override
public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
} @Override
public void onDeletionNotice(long directMessageId, long userId) {
System.out.println("Got a direct message deletion notice id:" + directMessageId);
} @Override
public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
System.out.println("Got a track limitation notice:" + numberOfLimitedStatuses);
} @Override
public void onScrubGeo(long userId, long upToStatusId) {
System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
}
...

6. 如何提速

api都是有访问次数限制的,twitter中不少都是以15分钟为单位的。为了爬取能达到一定的速度,我申请了50个app,只要pc给力,那么我就有50倍于单app的速度了。

那么我是单线程轮流用50个app还是50个线程一起呢?显然50个线程不可行,通常20个线程以上的时候花费在线程同步上的时间就很可观了,并且我们写的是爬虫,50个线程同时写数据库会严重拖慢速度。那么单线程呢?考虑到每个app用完其访问次数是需要一定时间的,特别要是网络状况不好的话次数用完可能会花费数分钟,那么15分钟显然无法让每个app都能访问api,造成了浪费。

所以我选择了线程池。IO密集型任务,一般将线程数设置为cpu的核数的两倍。同时设置两个队列,分别供各个线程读取数据和写数据。n个线程同时跑爬虫,再分一个线程出来维护那两个队列。框架如下:

好了,到这里应该能写twitter的api爬虫了。剩下的就是阅读各个api繁琐的文档,以及和各种bug搏斗的时间了╥﹏╥

API爬虫--Twitter实战的更多相关文章

  1. Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...

  2. 爬虫技术实战 | WooYun知识库

    爬虫技术实战 | WooYun知识库 爬虫技术实战 大数据分析与机器学习领域Python兵器谱-大数据邦-微头条(wtoutiao.com) 大数据分析与机器学习领域Python兵器谱

  3. 崔庆才Python3网络爬虫开发实战电子版书籍分享

    资料下载地址: 链接:https://pan.baidu.com/s/1WV-_XHZvYIedsC1GJ1hOtw 提取码:4o94 <崔庆才Python3网络爬虫开发实战>高清中文版P ...

  4. Restful API设计规范及实战【说的比较清楚了】

    Restful API设计规范及实战   Restful API的概念在此就不费口舌了,博友们网上查哈定义文章很多,直入正题吧: 首先抛出一个问题:判断id为 用户下,名称为 使命召唤14(COD14 ...

  5. 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码

    下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...

  6. Python 3网络爬虫开发实战》中文PDF+源代码+书籍软件包

    Python 3网络爬虫开发实战>中文PDF+源代码+书籍软件包 下载:正在上传请稍后... 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,真的可以为你们节省很多 ...

  7. Python 3网络爬虫开发实战中文 书籍软件包(原创)

    Python 3网络爬虫开发实战中文 书籍软件包(原创) 本书书籍软件包为本人原创,想学爬虫的朋友你们的福利来了.软件包包含了该书籍所需的所有软件. 因为软件导致这个文件比较大,所以百度网盘没有加速的 ...

  8. Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包(免费赠送)+崔庆才

    Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包+崔庆才 下载: 链接:https://pan.baidu.com/s/1H-VrvrT7wE9-CW2Dy2p0qA 提取码:35go ...

  9. 《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包

    <Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i ...

随机推荐

  1. 正确答案 全国信息学奥林匹克联赛( ( NOIP2014) 复 赛 模拟题 Day1 长乐一中

    [题目描述]小 H 与小 Y 刚刚参加完 UOIP 外卡组的初赛,就迫不及待的跑出考场对答案."吔,我的答案和你都不一样!",小 Y 说道,"我们去找神犇们问答案吧&qu ...

  2. php下载c

    1.php下载中,不认识的类型比如zip,rar,rmvb等可以直接点击链接下载<a href="one.zip">one.zip</a>. 2.php下载 ...

  3. Android——模拟文件拷贝

    模拟文件拷贝:要求:要用progressDialog和子线程来模拟显示拷贝进度:进度完成后在主界面提示拷贝完成,分别使用普通方式和消息机制编写. layout文件: <?xml version= ...

  4. P235 实战练习(集合类2)、摇奖程序和验证码(修改版)

    1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...

  5. spring beans源码解读之--Bean的注解(annotation)

    随着spring注解的引入,越来越多的开发者开始使用注解,这篇文章将对注解的机制进行串联式的讲解,不求深入透彻,但求串起spring beans注解的珍珠,展示给大家. 1. spring beans ...

  6. C++中的单例模式

    单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块,如系统的日志输出,G ...

  7. GBG java

    https://sourceware.org/gdb/onlinedocs/gdb/Sample-Session.html#Sample-Session http://m.blog.csdn.net/ ...

  8. python--flask使用

    Flask是一个使用 Python 编写的轻量级 Web 应用框架.下面我将使用Flask框架,创建一个简单的html页面示例. 1.项目的目录结构如下所示:exweb\  uniqueenv\  a ...

  9. unity,standalone下自定义分辨率不起作用的解法

    写一个Editor脚本AddMenu.cs:using UnityEditor; using UnityEngine; public class AddMenu : EditorWindow { [M ...

  10. 华东师大OJ:IP Address【IP地址转换】

    /*===================================== IP Address Time Limit:1000MS Memory Limit:30000KB Total Subm ...