0x00 前言

继续探索Twitter API的使用,这次获取一下Twitter的实时推文。

0x01 具体步骤

1、sample-steam 样本流

这是Twitter提供的代码,比较简单,只需要更改一下"bearer_token"即可使用,相对获得的数据单一,满足不了需求,下文讲解如何设定搜索规则

# -*- codeing =utf-8 -*-
# @Time : 2021/11/22 10:47
# @Author:yuchuan
# @File : twitter-sample-steam.py
# @Software : PyCharm
import requests
import os
import json# To set your environment variables in your terminal run the following line:
# export 'BEARER_TOKEN'='<your_bearer_token>'
bearer_token = 'your bearer_token'#look like "AAAAAAAAAAAAAAAAAAAAOHKRwEAAAAAXF5NOvPXXUPATBLLo*********"def create_url():return "https://api.twitter.com/2/tweets/sample/stream"def bearer_oauth(r):"""Method required by bearer token authentication."""r.headers["Authorization"] = f"Bearer {bearer_token}"r.headers["User-Agent"] = "v2SampledStreamPython"return rdef connect_to_endpoint(url):response = requests.request("GET", url, auth=bearer_oauth, stream=True)print(response.status_code)for response_line in response.iter_lines():if response_line:json_response = json.loads(response_line)print(json.dumps(json_response, indent=4, sort_keys=True))if response.status_code != 200:raise Exception("Request returned an error: {} {}".format(response.status_code, response.text))def main():url = create_url()timeout = 0while True:connect_to_endpoint(url)timeout += 1if __name__ == "__main__":main()

简单更改过BEARER_TOKEN后,就可以得到下面这样的数据啦

{"data": {"id": "1462613720471900162","text": "RT @shinslighterr: nao mas e essa official art de shingeki eu to me mijando https://t.co/m63s6sFGsJ"}
}
{"data": {"id": "1462613720442581000","text": "RT @Corinthians: SE BUSCA RIVAL EN AMERICA \nSE BUSCA RIVAL EN AMERICA\nSE BUSCA RIVAL EN AMERICA\nSE BUSCA RIVAL EN AMERICA\nSE BUSCA RIVAL EN\u2026"}
}
{"data": {"id": "1462613720463331328","text": "@kimkai_kggk yuk, gwe jaga lilin yh loe muter\ud83d\ude0d"}
}

这个样本得到的只有单纯的id,text,如果你需要其他元数据就需要进阶版的Stream Tweets了,下面就开始进阶讲解

2、Stream Tweets in real-time

1、首先讲解一下搜索内容的添加规则

详细规则可参考:

https://developer.twitter.com/en/docs/twitter-api/tweets/filtered-stream/integrate/build-a-rule

{"value": "dog has:images", "tag": "dog pictures"},
{"value": "cat has:images -grumpy", "tag": "cat pictures"}

Example :

"cat has:images“:关键词”cat"且有图片

“tag":“cat images”:分配的标签

lang:en 仅过滤英语推文

def set_rules(delete):# You can adjust the rules if neededsample_rules = [{"value": "dog has:images", "tag": "dog pictures"},{"value": "cat has:images -grumpy", "tag": "cat pictures"},]payload = {"add": sample_rules}response = requests.post("https://api.twitter.com/2/tweets/search/stream/rules",auth=bearer_oauth,json=payload,)
   2、搜索内容的返回字段设定

成功连接到流之后,默认响应Tweet字段:id、text,如果要获取这之外的内容,可以通过设置fields和扩展参数来指定

https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet

这是Twitter给出的参考文件,关于field 和 expansion的说明,可以根据需要自己组合

比如我需要的内容有,author.id , tweets , entities ( hashtags , urls , mentions ) , public_metrics ( like , reply , retweet )

Key Value Returned fields
tweet.fields public_metrics like,reply,retweet
expansions author_id includes.users.id, includes.users.name, includes.users.username
tweet.fields entities hashtags,urls,mentions

根据需要的扩展部分参数设定url,就可以获得相应的返回字段。

tweet_fields = "tweet.fields=public_metrics,entities"
"https://api.twitter.com/2/tweets/search/stream?{}&expansions=author_id".format(tweet_fields)
def get_stream(set):tweet_fields = "tweet.fields=public_metrics,entities"url = "https://api.twitter.com/2/tweets/search/stream?{}&expansions=author_id".format(tweet_fields)response = requests.get(url, auth=bearer_oauth, stream=True,)print(response.status_code)if response.status_code != 200:raise Exception("Cannot get stream (HTTP {}): {}".format(response.status_code, response.text))for response_line in response.iter_lines():if response_line:json_response = json.loads(response_line)print(json.dumps(json_response, indent=4, sort_keys=True))

3.总结一下

①set_rules(request.post)设定搜索内容

②get_stream(request.get)设定获取内容

0x02 实现代码:

发现了一个问题,因为我在设计搜索规则的时候debug了好几次,每一次我更改规则后,都是在原来关键词的stream中增加入新关键词的stream, 我查了一下应该是因为request.post的原因。总之,爬出的内容要进行过滤保存,过滤时精确一点即可,这个搜索出来的内容应该是不占用Twitter api中每月限制爬取数额的。

# -*- codeing =utf-8 -*-
# @Time : 2021/11/22 15:28
# @Author:yuchuan
# @File : twitter_stream_tweets.py
# @Software : PyCharm
import requests
import os
import json# To set your enviornment variables in your terminal run the following line:
# export 'BEARER_TOKEN'='<your_bearer_token>'
bearer_token ='<your_bearer_token>'#same as'AAAAAAAAAAAAAAAAAAAAAOHKRwEA**********'def bearer_oauth(r):"""Method required by bearer token authentication."""r.headers["Authorization"] = f"Bearer {bearer_token}"r.headers["User-Agent"] = "v2FilteredStreamPython"return r#
# def get_rules():
#     response = requests.get(
#         "https://api.twitter.com/2/tweets/search/stream/rules", auth=bearer_oauth
#     )
#     if response.status_code != 200:
#         raise Exception(
#             "Cannot get rules (HTTP {}): {}".format(response.status_code, response.text)
#         )
#     print(json.dumps(response.json()))
#     return response.json()
#
#
# def delete_all_rules(rules):
#     if rules is None or "data" not in rules:
#         return None
#
#     ids = list(map(lambda rule: rule["id"], rules["data"]))
#     payload = {"delete": {"ids": ids}}
#     response = requests.post(
#         "https://api.twitter.com/2/tweets/search/stream/rules",
#         auth=bearer_oauth,
#         json=payload
#     )
#     if response.status_code != 200:
#         raise Exception(
#             "Cannot delete rules (HTTP {}): {}".format(
#                 response.status_code, response.text
#             )
#         )
#     print(json.dumps(response.json()))
#
#
def set_rules():# You can adjust the rules if neededsample_rules = [{"value": "Russia",},]payload = {"add": sample_rules}response = requests.post("https://api.twitter.com/2/tweets/search/stream/rules",auth=bearer_oauth,json=payload,)if response.status_code != 201:raise Exception("Cannot add rules (HTTP {}): {}".format(response.status_code, response.text))print(json.dumps(response.json()))def get_stream(set):tweet_fields = "tweet.fields=public_metrics,entities"url = "https://api.twitter.com/2/tweets/search/stream?{}&expansions=author_id".format(tweet_fields)response = requests.get(url, auth=bearer_oauth, stream=True,)print(response.status_code)if response.status_code != 200:raise Exception("Cannot get stream (HTTP {}): {}".format(response.status_code, response.text))for response_line in response.iter_lines():if response_line:json_response = json.loads(response_line)print(json.dumps(json_response, indent=4, sort_keys=True))def main():# rules = get_rules()# delete = delete_all_rules(rules)set = set_rules()get_stream(set)if __name__ == "__main__":main()

0x03 一些闲话

本人创建了一个公众号,分享科研路上的小问题,新发现,欢迎关注公众号,给我留言!!!
一起奋发向上,攻克难题吧~~

【Twitter 舆论分析】Twitter 实时推文爬虫相关推荐

  1. 特朗普近百条推文,被 Twitter 标记为「不实消息」

    By 超神经 内容提要:自从 2016 年美国大选之后,各社交平台因虚假消息误导选民而备受批评.近几年来,Twitter 在消除虚假信息上投入了大力气,最近晒出了今年的成果. 关键词:Twitter ...

  2. blogger_如何在博客中添加推文并调试基本JavaScript:为什么Twitter.com/JavaScript/Blogger JSONP Widget停止工作?...

    blogger I have a little yellow bar at the top of my blog that is supposed to show my latest Tweet. I ...

  3. 推特开发者 学术——【Twitter 开发者账号】使用tweepy4 搜索历史推文

    关于推特开发者账号 elevated academic 请看此贴: 推特开发者账号申请权限 或 搜索微信公众号 twitterDeveloper 获得帮助 tweepy4.0的安装请看: https: ...

  4. apache camel_学习Apache Camel –实时索引推文

    apache camel 在大多数软件开发项目中,有一点需要使应用程序开始与其他应用程序或第三方组件通信. 无论是发送电子邮件通知,调用外部api,写入文件还是将数据从一个地方迁移到另一个地方,您都可 ...

  5. 学习Apache Camel –实时索引推文

    在大多数软件开发项目中,有一点需要使应用程序开始与其他应用程序或第三方组件通信. 无论是发送电子邮件通知,调用外部api,写入文件还是将数据从一个地方迁移到另一个地方,您都可以推出自己的解决方案或利用 ...

  6. 判断字符串不超过20个字符_如何阻止超过140个字符的推文(如果确实需要)

    判断字符串不超过20个字符 After over a decade of staunchly restricting users to 140 characters in each message, ...

  7. 在Python中使用Twitter Rest API批量搜索和下载推文

    数据挖掘 , 编程 (Data Mining, Programming) Getting Twitter data 获取Twitter数据 Let's use the Tweepy package i ...

  8. twitter推文采集案例

    案例内容:twitter的推文采集. 通过游客身份获取twitter中用户的推文. 用户推文:只能翻22页,1页45条左右. 每个用户最多获取最近900条推文 (登录后),不登录区别也不大. User ...

  9. python推特爬虫_Tweepy1_抓取Twitter数据

    之前一直想用爬虫登陆并抓取twitter数据,试过scrapy,requests等包,都没成功,可能是我还不太熟悉的原因,不过 今天发现了一个新包tweepy,专门用于在Python中处理twitte ...

最新文章

  1. 终于把 7 年前的 Docker Hub 账号恢复了
  2. 1000内同时被3,5,7整除的数
  3. Windows Mobile 开发环境搭建(1)
  4. 经验:在mysql中避免重复插入数据的4种方式
  5. SpringCloud入门 - 分布式事务【概念、常见框架选择 - tx-lcn】
  6. jQuery选择文本事件函数– select()方法
  7. 谷粒商城:15.商城业务 — 商品上架
  8. centos7 vsftpd默认端口修改
  9. string和string.h以及cstring的区别
  10. 微课录制神器,新手老师必备录屏软件!
  11. WEB-漏洞总结(sql注入详解)
  12. 《算法》中的红黑树实现
  13. SEO优化:什么是SEO链轮?站群与博客群的优劣比较!
  14. java常用英语单词
  15. pci总线定时协议_PCI总线标准协议(中文版)
  16. K型热电偶(k-type)温度与电压转换计算笔记
  17. 【 Tomcat 】
  18. OpenFOAM 中的 RTS 机制
  19. 计算机专业考农业工程与信息技术,中国农业大学农业工程与信息技术2021考研经验指导...
  20. Cesium 获取当前视图的中心经纬度

热门文章

  1. 根据ip获取地址和运营商
  2. Android 音频录音与播放
  3. Python 查看文件列表
  4. 高通骁龙820A芯片,众多品牌为其站台
  5. mysql 联合主键重复数据库_联合主键和复合主键有什么区别
  6. Flutter Scaffold
  7. EasyUI之treegrid学习
  8. 卡尔曼滤波与组合导航原理_基于RAEKF的GPS/INS紧组合导航方法研究
  9. PPTP和L2TP哪种好?
  10. 用mpv实现多视频同步播放