api爬虫--twitter实战

張暁磊 張暁磊     2022-08-08     188

关键词:

本篇将从实际例子出发,展示如何使用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搏斗的时间了╥﹏╥

python爬虫实战-基于代理池的高并发爬虫(代码片段)

最近在写一个基于代理池的高并发爬虫,目标是用单机从某网站API爬取十亿级别的JSON数据。代理池有两种方式能够实现爬虫对代理池的充分利用:搭建一个TunnelProxy服务器维护代理池在爬虫项目内部自动切换代理所谓TunnelProxy实... 查看详情

python爬虫实战,scrapy实战,抓取并分析天气数据(代码片段)

前言利用Python“简单地”抓取并分析一下天气数据。补充一下之前数据可视化的空白。开发工具**Python版本:3.6.4相关模块:PIL模块;requests模块;pyecharts模块;以及一些Python自带的模块。环境搭建同Python简单分析微信好友。主要... 查看详情

python爬虫实战,scrapy实战,爬取知乎表情包(代码片段)

前言今天我们就用scrapy爬取知乎表情包。让我们愉快地开始吧~开发工具Python版本:3.6.4相关模块:scrapy模块请求模块;fake_useragent模块;以及一些python自带的模块。环境搭建安装Python并添加到环境变量,pip安装需要的相关模块即... 查看详情

如何检查请求是不是来自 google、facebook、twitter 和 bing 爬虫? [复制]

】如何检查请求是不是来自google、facebook、twitter和bing爬虫?[复制]【英文标题】:Howtocheckiftherequestisfromgoogle,facebook,twitterandbingcrawlers?[duplicate]如何检查请求是否来自google、facebook、twitter和bing爬虫?[复制]【发布时间】:2016-01-0309... 查看详情

python爬虫编程思想(91):项目实战--支持搜索功能的图片爬虫

    本文会使用requests库抓取百度图像搜索API返回的JSON数据,并根据图像URL下载图像文件。由于API返回的是JSON格式的数据,所以不需要使用任何HTML分析库,只需要将数据转换为JSON对象即可。     ... 查看详情

python爬虫编程思想(91):项目实战--支持搜索功能的图片爬虫

    本文会使用requests库抓取百度图像搜索API返回的JSON数据,并根据图像URL下载图像文件。由于API返回的是JSON格式的数据,所以不需要使用任何HTML分析库,只需要将数据转换为JSON对象即可。     ... 查看详情

python爬虫编程思想(92):项目实战:抓取京东图书评价

    本文实现的爬虫会抓取京东商城指定图书的评论信息。本例使用requests抓取图书评论API信息,然后通过json模块的相应API将返回的JSON格式的字符串转换为JSON对象,并提取其中感兴趣的信息。    &nbs... 查看详情

python爬虫编程思想(92):项目实战:抓取京东图书评价

    本文实现的爬虫会抓取京东商城指定图书的评论信息。本例使用requests抓取图书评论API信息,然后通过json模块的相应API将返回的JSON格式的字符串转换为JSON对象,并提取其中感兴趣的信息。    &nbs... 查看详情

Firebase 托管:检测 facebook、twitter 和 google 等社交媒体爬虫机器人

】Firebase托管:检测facebook、twitter和google等社交媒体爬虫机器人【英文标题】:Firebasehosting:Detectsocialmediacrawlerbotslikefacebook,twitterandgoogle【发布时间】:2018-03-1618:29:03【问题描述】:我目前有像这样重定向到index.html的firebase托管设... 查看详情

python爬虫入门到实战-史上最详细的爬虫教程

马哥高薪实战学员【Python爬虫入门到实战-史上最详细的爬虫教程,限时免费领取】爬虫分类和ROBOTS协议爬虫URLLIB使用和进阶爬虫URL编码和GETPOST请求 查看详情

python爬虫入门到实战-史上最详细的爬虫教程

马哥高薪实战学员【Python爬虫入门到实战-史上最详细的爬虫教程,限时免费领取】爬虫分类和ROBOTS协议爬虫URLLIB使用和进阶爬虫URL编码和GETPOST请求 查看详情

如何入门爬虫(基础篇)

一、爬虫入门Python爬虫入门一之综述Python爬虫入门二之爬虫基础了解Python爬虫入门三之Urllib库的基本使用Python爬虫入门四之Urllib库的高级用法Python爬虫入门五之URLError异常处理Python爬虫入门六之Cookie的使用Python爬虫入门七之正则... 查看详情

python爬虫实战,爬虫之路,永无止境(代码片段)

python爬虫实战好久没给大家跟新爬虫文章了,抱歉抱歉,这期给大家带来一篇小爬虫,希望大家喜欢,喜欢的来个关注,支持一下博主,谢谢各位了。写代码了各位宝宝们这里要注意一点就是要记得提前登... 查看详情

python爬虫实战,爬虫之路,永无止境(代码片段)

python爬虫实战好久没给大家跟新爬虫文章了,抱歉抱歉,这期给大家带来一篇小爬虫,希望大家喜欢,喜欢的来个关注,支持一下博主,谢谢各位了。写代码了各位宝宝们这里要注意一点就是要记得提前登... 查看详情

python爬虫实战,scrapy实战,大众点评爬虫(代码片段)

前言爬一波大众点评上美食板块的数据,顺便再把爬到的数据做一波可视化分析开发工具Python版本:3.6.4相关模块:scrapy模块;requests模块;fontTools模块;pyecharts模块;以及一些python自带的模块。环境搭建安装python并添加到环境... 查看详情

python爬虫实战教程:爬取网易新闻;爬虫精选高手技巧

...可拿,,一起相互监督共同进步!此文属于入门级级别的爬虫,老司机们就不用看了。本次主要是爬取网易新闻,包括新闻标题、作者、来源、发布时间、新闻正文。首先我们打开163的网站,我们随意选择一个分类,这里我选的... 查看详情

《爬虫网络开发实战》

爬虫抓取用到的Python库,request,selenium,aiohtto(下面是request的安装)wheel是Python的一种安装包selenium的安装 查看详情

什么是爬虫-java网络爬虫系统性学习与实战

什么是爬虫-Java网络爬虫系统性学习与实战(2)文章目录我的简单理解维基百科的定义爬虫策略爬虫核心点爬虫的要素联系方式Java网络爬虫系统性学习与实战系列上一篇文章:纲要-Java网络爬虫系统性学习与实战(1)我的简单... 查看详情