本篇将从实际例子出发,展示如何使用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. 工作中遇到的问题--eclipse没有方法提示

    一.eclipse自身配置问题步骤:1. 打开Eclipse ,然后“window”→“Preferences”2. 选择“java”,展开,“Editor”,选择“Content Assist”.3 ...

  2. #梦断代码#first blood

    前几天大致瞅了一眼,哇~原来不是啃代码的书,像是本小说,读起来很舒服,翻译的相当贴近生活,“这边厢......那边厢......”这类的语言很喜欢,还没看多少,对博客园比较新奇就先写个博客签个到,每天 ...

  3. 20145220java程序设计第九周学习总结

    20145220java程序设计第九周学习总结 教材学习内容总结 JBDC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商对接口直接操作,开发人员无须接触底层数据可驱动程序的差异 ...

  4. java的nio之:java的nio系列教程之SocketChannel

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...

  5. VIM进阶学习之几种模式和按键映射

    Map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手. vim里最基本的map用法也就是 :map c a 这里把c映射成了a,在map生效的情况下,按下c就等同于按下了a 当然 ...

  6. Microservice Orleans

    https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/ https://channel9.msdn.c ...

  7. linux服务之openldap

    http://www.openldap.org/ http://blog.csdn.net/chinalinuxzend/article/details/1870656 OpenLDAP学习笔记 ht ...

  8. sublime个人快捷键

    ctrl+alt+f  =  代码格式化(html,js) ctrl+d  =  选中相同内容 alt+shift+w  =  为内容添加新标签 ctrl+shift+a = 选择标签内的内容(再按一 ...

  9. Dom之标签增删操作

    dom操作:THML新增子标签 a标签(appendChild) <!DOCTYPE html><html lang="en"><head> & ...

  10. js和css内联外联注意事项

    简单说:这两个问题其实是同一个问题,但是网上找了好久也找不到方法,外联的js和css文件里不能有任何HTML的标记注释,一旦有,浏览器就疯了!一去掉就好了!!! 问题:起因是网上看到一个css的表格样 ...