【笔记】使用Twitter API V2进行数据爬取的经验总结
写在最前面:这篇笔记主要是基于自己使用API过程中遇到的问题以及不断的尝试形成的经验总结,所有内容都是一个字一个字敲的,所以还挺辛苦的。不过也正是因为这只是一些个人经验的归纳,所以对于API的函数和功能也会存在理解不到位的情况,还请谅解嘿嘿~当然也欢迎讨论交流!
主要参考链接:
- 流数据是什么?_流数据的优势-AWS云服务
- Client — tweepy 4.12.1 documentation
目录
使用Twitter API抓取数据的基础知识
Response对象
Tweet对象
User对象
常用参数说明
StreamingClient
Pagination
在正式进行数据爬取之前,有两件基本的事情要做
Step 1: 获取 API Key and Secret, Bearer Token, Access Token and Secret。申请API的流程网上已经有很多分享了,这里就不再赘述。大致过程类似于(详细步骤)申请twitter api - 注册推特网站 - 实验室设备网 (zztongyun.com)
Step 2:判断是否需要使用streaming来进行爬虫
- 流数据(Streaming data): 数千个数据源持续生成的数据,通常也同时以数据记录的形式发送
- 流数据的处理适用于持续生成动态新数据的大多数场景
如果选择不使用streaming进行爬虫,不需要爬实时数据,就可以选择使用一般的Client类进行爬虫。如果选择使用stream进行爬虫,在Twitter API V2的场景下就主要会使用到StreamingClient这个类,当然有可能也需要使用到StreamResponse,StreamRule等。
使用Twitter API抓取数据的基础知识
不论是使用哪种数据抓取的方式,有几个关键知识是最好先提前了解的。只针对于获取数据的get相关函数而言,常用到的参数包括expansions, max_results,几类fields,以及query。返回的通常为Response对象。
Response对象
get函数返回的通常为Response对象,包含的object常用的为user或者tweet对象。其他object的类型还有Spaces,Lists,Media,Polls,Places。完整的各个object包含的信息可以在Twitter API v2 data dictionary | Docs | Twitter Developer Platform 中对应的链接中查看。
如果需要在返回的top-level object(例如user或tweet)之外,还想要返回其他object的信息,可以通过expansion或者几类fields的的参数进行指定。需要注意的是,在Respnose中返回的第一个对象是top-level object,其余指定返回的对象信息包含在includes里面。
这里主要给出最常用的Tweets和Users对象的使用方法整理。
Tweet对象
Tweets对象是User,Media,Polls,Places的parent object,也是Twitter的基础模块之一。
Tweet对象的返回默认值为:id,text。其余可能会经常用的值还有author_id,conversation_id,created_at,lang等等。完整的表格可以见Tweet object | Docs | Twitter Developer Platform。
在返回对象为users的函数中,可以通过expansions=pinned_tweet_id获得Tweet的默认值;同样在返回对象为tweet的函数中,通过expansions=referenced_tweets.id也可以获得tweet的默认值。除此之外,如果还需要返回更多tweet的值,可以在函数的tweet_fields参数中指定。
此处需要注意的是,按照参数说明指定返回的内容在直接print出Response对象的时候可能并不能直接看到。例如,
tweet = client.get_tweet(id, expansions=["author_id"],tweet_fields=["public_metrics"],user_fields=["description", "public_metrics", "location", "verified"])
此时返回的结果大致为(为了保护用户信息,没有给出真实返回的信息)
Response(data=<Tweet id=XXXXXXXXXXX text='XXXXXXXX'>, includes={'users': [<User id=xxxxxxxx name=XXXXXXX username=XXXX1234>]}, errors=[], meta={})
可以看到,返回的结果中包含的data部分是tweet类型的对象,includes部分包含的是user对象,但是此时user对象的内容仅包含id,name和username的默认参数,并没有我们指定的tweet_field以及user_field的其他参数。
这个时候对于附加参数的读取可以采用
# tweeet_fields中的public_metrics指定的是tweet的属性,会随着tweet对象在data部分返回
print(tweet.data.public_metrics) # user_fields中指定的参数在includes部分,取值的时候有一个‘[0]’是因为返回的user对象是发推文的用户,只存在一个用户,为了取出这唯一一个user的对象,就需要取数组的有且唯一一个元素
print(tweet.includes['users'][0].description)
print(tweet.includes['users'][0].public_metrics)
print(tweet.includes['users'][0].location)
print(tweet.includes['users'][0].verified)
User对象
user对象返回的默认值为id,name,username。其他常用的值还包括created_at, description等。完整的表格见User object | Docs | Twitter Developer Platform。
通常user对象可以在相关的get函数中返回,也可以在返回tweet对象的get函数中额外返回。其中如果只使用expansions=author_id或者expansions=in_reply_to_user_id的话,额外返回的user信息只会包含user对象的默认值。除此之外,如果还需要返回更多user的值,可以在函数的user_fields参数中指定。
常用参数说明
expansions:我对于expansions的理解是,通过对expansions的指定,可以快速返回不同场景下fields对应的默认值,如果需要返回除了默认值以外的信息,还是需要通过相关的fields参数进行指定。对于tweet和user对象而言,常用的expansions参数设置为
- tweet:
- expansions=referenced_tweets.id
- expansions=pinned_tweet_id
- user:
- expansions=author_id
- expansions=entities.mentions.username
- expansions=in_reply_to_user_id
- expansions=referenced_tweets.id.author_id
其他的expansions设置可以在Expansions and Fields — tweepy 4.12.1 documentation中查看。
- tweet:
max_results:通常最大值为100
几类fields:media_fields,place_fields,poll_fields,tweet_fields,user_fields。**在不使用fields这个参数时,请求返回的对象只包括top-level的object以及expansions里面提到的objects,如果需要返回其他fields的数据,可以在对应的media_fields,place_fields,poll_fields,tweet_fields,user_fields中指定。其中同样较为常用的也是tweet_fields和user_fields,相关的信息可以查看对应object中包含的值。
query:尤其在search tweets相关的函数中,需要通过查询的条件获取满足条件的tweets,此时默认的参数就是query。query的基础规则和操作符可以参见https://developer.twitter.com/en/docs/tutorials/building-powerful-enterprise-filters/understand-the-basics。类似的规则还会用在filter或者rule相关的函数中
StreamingClient
可以参考Streaming — tweepy 4.12.1 documentation中的使用流程介绍敲代码,个人觉得在使用StreamingClient抓取数据时可能会使用到的代码基础框架如下:
from tweepy import StreamingClientclass IDPrinter(tweepy.StreamingClient):def on_tweet(self, tweet):print(tweet.id)stream = StreamingClient(bearer_token=bearer_token, return_type=dict, wait_on_rate_limit=True)
printer = IDPrinter("Bearer Token here")
printer.sample()
上述代码完成的基本功能是:输出实时发布的tweet的id。
- 若需要输出更多信息,可以在on_tweet中结合Client类的函数进行数据的输出和搜索。
- 若需要对流数据进行筛选,主要可以使用以下三个函数完成:
- streaming_client.add_rules(tweepy.StreamRule("Tweepy"))
- streaming_client.filter()
- 此外,为了增加流数据处理过程中的错误处理能力,可以在class IDPrinter中增加例如on_connection_error(self)函数,更多的函数和参数说明可以在Tweepy使用文档的StreamingClient部分查看。
Pagination
在大多数API函数的调用中都会存在着返回结果最大数量的限制,即max_results。这意味着,我们在一次请求中只能最多获得例如一个用户最新发表100条推文。但如果我们想要获取这个用户的所有推文,且不想原基于函数的pagination_token逐页的请求结果返回的话,就可以考虑使用API提供的另一个更为直接的功能模块Pagination。
class tweepy.Paginator(self, method, *args, limit=inf, pagination_token=None, **kwargs)
当被传递的方法返回的响应是 requests.Response 类型时,它将被反序列化来解析分页标记。意思就是,通过对函数中‘method’的指定,我们可以将所有的结果按照指定页的大小进行按页数的分割。这样就可以通过对一次性请求返回的对象进行迭代读取,获取每一页的内容逐页提取推文信息。
具体使用方法如下:
paginator = tweepy.Paginator(client.get_users_followers, id=xxxxx, max_results=200)for page in paginator:.....
其余参数和功能可以参考官方文档进行尝试:Pagination — tweepy 4.12.1 documentation
以上!!
【笔记】使用Twitter API V2进行数据爬取的经验总结相关推荐
- python网络爬虫学习笔记(十一):Ajax数据爬取
文章目录 1.基本介绍 2.基本原理 3.实战 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到 ...
- python爬虫从入门到实战笔记——第一章爬虫原理和数据爬取
爬虫原理和数据抓取 1.1 通用爬虫和聚焦爬虫 通用爬虫 聚焦爬虫 1.2 HTTP和HTTPS HTTP的请求与响应 浏览器发送HTTP请求的过程: 客户端HTTP请求 请求方法 常用的请求报头 服 ...
- Python3 爬虫学习笔记 C03 【Ajax 数据爬取】
Python3 爬虫学习笔记第三章 -- [Ajax 数据爬取] 文章目录 [3.1]Ajax 简介 [3.2]解析真实地址提取 [3.1]Ajax 简介 Ajax - Asynchronous Ja ...
- 爬虫笔记——东方财富科创板数据爬取(requests方法)
爬虫笔记--东方财富科创板数据爬取(requests方法) 网页观察 网页源代码分析 具体代码 上篇文章:爬虫笔记--东方财富科创板数据爬取(selenium方法)介绍了selenium爬取东方财富科 ...
- 利用twitter官网提供的api 及tweepy库 爬取tweets
利用twitter官网提供的api及tweepy库爬取tweets tweepy官网文档 思路: 1.以用户为中心,爬取用户的所有推文数据 2.根据用户id寻找用户朋友的tweeter id扩展待爬用 ...
- 爬虫笔记——东方财富科创板数据爬取(selenium方法)
爬虫笔记--东方财富科创板数据爬取(selenium方法) 网站观察 网站分析 公司详情页面 具体代码 selenium方式爬取 优点:无需观察网站去查找数据来源 缺点:速度较requests方法更慢 ...
- 分析智联招聘的API接口,进行数据爬取
分析智联招聘的API接口,进行数据爬取 一丶简介 现在的网站基本上都是前后端分离的,前端的你看到的数据,基本上都不是HTML上的和数据,都是通过后端语言来读取数据库服务器的数据然后动态的加载数据到前端 ...
- 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫
PS:(本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.由于微博接口更新后限制增大,这个代码已经不能用来爬 ...
- DOTA2利雅得大师赛利用api多线程对选手数据和战队数据爬取与分析
首先恭喜中国战队LGD夺下本次利雅得大师赛冠军! 目录 数据的爬取 选手数据以及战队数据爬取 数据分析 数据(因为原数据的英雄都是id,这里进行连接将英雄id替换为英雄名 ) 选手KDA前十名 选手参 ...
最新文章
- pythonscrapy爬虫_Python 爬虫:Scrapy 实例(二)
- How to resolve unassigned shards in Elasticsearch——写得非常好
- java调用sql返回list_Hibernate执行原生SQL返回ListMap类型结果集
- 【Mac软件推荐】Alfred:Mac下最好的快速启动工具
- python学习笔记(八)类(classes)
- Windows 7下实现×××连接自动创建
- 2048java课程设计报告_软件工程——Java版2048游戏学习报告
- 【实践驱动开发3-002】TI WL1835MODCOM8 在android的移植 - 软件获取
- AMD宣布350亿美元收购赛灵思,CPU、GPU、FPGA全凑齐
- easyui加载后台数据 笔记
- 线程通信之多个线程循环执行,(A线程执行5次,B线程执行10次,C线程执行15次)...
- android一些不常用的事件
- Luogu4921/4931 情侣?给我烧了! 组合、递推
- java JDK设置环境变量
- 竞选计算机协会网络部部长,计算机协会部长竞选演讲稿
- 样本不平衡,欠采样,过采样
- trainNetwork - Matlab官网介绍的中文版
- 【黄啊码】微信小程序弹窗图片滚动
- 觅伊、Soul,这些社交软件是怎么火起来的?
- 绘制confusion matrix的R实现
热门文章
- springboot延时任务
- 中国研究生招生信息网显示服务器错误,2020考研预报名入口无法进入怎么办-中国研究生招生信息网...
- 小明买12瓶汽水,喝完后3个空瓶可以换1瓶汽水,问小明一共可以喝多少瓶汽水?
- Maemo中如何启动应用程序。
- 织梦CMS v5.7 完美实现导航条下拉二级菜单
- C++day07 多态的原理
- WebSocket是什么?如何去使用WebSocket?
- CBAM——即插即用的注意力模块(附代码)
- 电路硬件设计基础(Altium designer的基本使用及一些板子制作流程)20220113
- 复星联合创始人梁信军:谁掌握了海量区块链账户,谁就是赢家