如何抓取 Twitter
我们将为您提供有关如何使用 Python 抓取 Twitter 信息流的分步示例。
如果你打算 抓取社交媒体Twitter 是最好的目标平台之一。它每月有 230 亿用户,拥有大量有价值的信息。你可以用很多方法来使用它——从进行情绪分析到发现市场趋势和改进你的营销策略。
尽管 Twitter 非常慷慨地允许访问其数据,但官方 API 需要经过筛选过程,并且施加了相当多的限制。为了克服这些问题,您必须寻找替代方案,而网络抓取是最好的替代方案。
本指南将教您有关 Twitter 抓取的所有知识,向您介绍 API 替代方案以及您在使用过程中可能遇到的挑战。此外,您还将找到一个分步示例,说明如何使用 SNScrape。如果您更喜欢视频,我们也有视频:
什么是 Twitter 抓取 – 定义
Twitter 抓取是一种自动从社交媒体平台收集公共数据的方法。它通常使用预制的抓取工具或定制的网页抓取工具来完成。Twitter 是少数提供官方 API 的平台之一,但使用起来可能很麻烦,因为它限制了您可以获取的推文数量(3,200 条)及其最近时间(最近 7 天)。
社交媒体营销人员利用 Twitter 的受欢迎程度为自己谋利。他们收集信息,例如(转发)推文、分享、URL、点赞、主题和关注者等。抓取 Twitter 信息可以对影响者营销、品牌和声誉监控、情绪分析或市场趋势提供许多见解。
抓取 Twitter 信息合法吗?
那么,无需登录就可以抓取哪些数据?
让我们将您可以抓取的 Twitter 数据点分为三类:
- 微博: 文本和视觉媒体、推文 URL、推文 ID、转发、根据位置或点赞整理推文。
- 简介: 姓名、图片、关注者和推文数量、用户简介、最新帖子数据(如内容、时间、转发、回复等)。
- 标签和关键词: 推文 URL、创建时间、提及、位置、用户名、回复和引用计数、对话 IF、转发、媒体数据(如链接)、类型等。
然而,Twitter 越来越要求登录才能查看其内容。在过去的一年里,Reddit 社区报告了许多有关 Twitter 决定将更多内容移至登录表单的问题。您可能会在网站的各个区域遇到此问题,例如在 Twitter 线程中向下滚动时。
目前,有一个简单的解决方法,即清除浏览器 cookie。但是,对于网络抓取社区来说,门控内容意味着什么呢?可以预见的是,未来可供收集的公开数据点将会越来越少。
如何在没有 API 的情况下抓取 Twitter 数据
除了使用官方 API 之外,还有多种方法可以从 Twitter 收集公开数据。
一个是 自己构建一个抓取工具 使用网络抓取库。这可能是最难的方法,但它也给你最大的控制权,特别是当你遇到其他方法的限制时。虽然抓取 Twitter 比 在 Instagram 上收集数据,你仍然需要使用 无头浏览器 渲染 JavaScript,以及 推特代理 以避免你的 IP 被封锁。
如果你不喜欢摆弄代码,你可以使用 商业无代码抓取工具 比如 PhantomBuster 和 ParseHub。这些可视化工具提供了方便的模板或点击界面。虽然它们对于简单的任务来说很容易,但一旦扩展,它们就会变得越来越复杂和低效。
最后,您可以使用以下之一 预制 Twitter 网页抓取库。这些工具允许您通过在代码编辑器或命令行中输入命令来提取数据。它们不需要 API 身份验证或代理即可工作。SNScrape 就是一个例子;Twint 曾经是另一个例子,但它不再维护。
如何使用 Python 抓取 Twitter 数据:分步指南
- 您可以在几分钟内开始检索有用的数据,
- 它不受 API 推文限制的约束,并且
- 它返回超过七天的历史数据。
SNScrape 拥有针对平台不同方面的 Twitter 模块,例如搜索、主题标签和用户资料。总而言之,您可以使用它来提取以下数据点:用户、用户资料、主题标签、搜索、推文(单个或周围线程)、列表帖子和趋势。
预赛
要使以下代码正常运行,您需要安装 SNScrape 库。您可以在操作系统的终端中输入以下行来执行此操作:
pip3 install snscrape
开始之前,请创建一个新的文本文档。我们将其命名为 scraping1.py,但您可以使用任何名称。打开文件开始编码。
如何抓取 Twitter 搜索数据
让我们从 Twitter 搜索开始。我们将抓取查询的前 100 条推文 居民代理.
步骤 1。 导入必要的模块。我们需要 Twitter(现为X) 来自 SNScrape 的模块和 JSON:
from snscrape.modules import twitter
import json
步骤 2。 让我们从 Twitter 搜索开始,从数据中获取更大的图景。你必须定义 通过搜索获取 功能。
1) 首先,我们将重点关注变量。首先输入 查询 变量并将关键字分配为字符串值。
queries = ['residential proxies']
2) 然后,定义要抓取的推文数量。如果你忽略了这一点,会话将不会结束,直到你抓取了所有相关推文。让我们设置 最大结果数 请求参数设置为 100,这样你就不会被数据淹没。
max_results = 100
3) 接下来,实现 scraper 本身。这将为每个查询创建一个新的 scraper 对象实例。
def scrape_search(query):
scraper = twitter.TwitterSearchScraper(query)
return scraper
步骤 3。 接下来,让我们在以下几行中为每个查询迭代一个专用的输出文件。这样,您将在文本文件中获得结果。
for query in queries:
output_filename = query.replace(" ", "_") + ".txt"
with open(output_filename, 'w') as f:
scraper = scrape_search(query)
i = 0
for i, tweet in enumerate(scraper.get_items(), start = 1):
步骤 4。 现在,将抓取的推文转换为 .json 对象进行数据解析,只有结果转换完成后才能访问其内容。
tweet_json = json.loads(tweet.json())
打印出推文的内容,例如其文本、创建者的用户名、日期等。
print (f"\nScraped tweet: {tweet_json['content']}")
以下行用于将数据写入输出文件。
f.write(tweet.json())
f.write('\n')
f.flush()
步骤 5。 最后,让我们添加终止循环的代码 最大结果 达到。
if max_results and i > max_results:
break
恭喜,您刚刚定义了该函数,现在是时候继续抓取了。
保存代码,打开命令提示符,并将其更改为保存代码的目录。然后,运行代码。结果出来后,您应该会在 content 键下看到用户名、日期、URL 和推文本身等参数。
如何抓取 Twitter 标签
按照上述示例,您还可以轻松抓取其他数据:例如,主题标签。只需将 TwitterSearchScraper 切换到 TwitterHashtagScraper。不要使用查询变量,而是编写您选择的标签。但请注意不要在值中留下破折号,否则代码将无法正常工作。
以下是如何定义 通过标签搜索 函数。您还需要更改循环中的刮刀 – ,来自 scraper = scrape_search(查询) 至 scraper = scrape_hashtag(查询)后面的例子也是同样的道理。
hashtag = ['scraping']
max_results = 50
def scrape_hashtag(hashtag):
scraper = twitter.TwitterHashtagScraper(hashtag)
return scraper
如何抓取 Twitter 用户数据
您还可以按用户名或用户 ID 进行抓取。但是,这里事情有点棘手,所以请看一下用户 ID 示例。定义输入变量时,不要忘记布尔运算符。此外,请确保将用户名和用户 ID 列为字符串。
UserId = [‘1097450610864123904’, True]
max_results = 50
def scrape_user(user, isUserId):
twitter.TwitterUserScraper(user, isUserId)
return scraper
如何在 Twitter 上抓取一条推文
如果您要搜索特定推文,也可以通过推文 ID 进行抓取。如果帖子包含产品评论等重要信息,这可能会很有用。这里的方法类似,但这次输入值是整数而不是字符串。当然,我们必须使用另一个抓取工具。
TweetId = 1516359017374887940
def scrape_tweet(tweetId):
scraper = twitter.TwitterTweetScraper(tweetId)
return scraper
以下是完整脚本:
from snscrape.modules import twitter
import json
# List of queries to scrape
queries = ['residential proxies']
#Max results to get per each query
max_results = 100
# Scrapes Twitter search
# Input: Twitter search (string)
# Example query: "covid"
def scrape_search(query):
scraper = twitter.TwitterSearchScraper(query)
return scraper
#-- Other scrapers that can be implemented
#Scrapes a single tweet
# Intput: Tweet ID (integer)
# Example tweet_id: 1516359017374887940
def scrape_tweet(tweet_id):
scraper = twitter.TwitterTweetScraper(tweet_id)
return scraper
# Input:
# If scraping by Username - username (string), False (boolean)
# Example username "Proxyway1", False
# If scraping by User ID - user_id (string), True (boolean)
# Example User ID "1097450610864123904", True
def scrape_user(user, isUserId):
twitter.TwitterUserScraper(user, isUserId)
return scraper
# Input: Twitter hashtag (string) (without '#')
# Example hashtag: "scraping"
def scrape_hashtag(hashtag):
scraper = twitter.TwitterHashtagScraper(hashtag)
return scraper
for query in queries:
#Creating an output file for each query
output_filename = query.replace(" ", "_") + ".txt"
with open(output_filename, 'w') as f:
scraper = scrape_search(query)
i = 0
for i, tweet in enumerate(scraper.get_items(), start = 1):
# Converting the scraped tweet into a json object
tweet_json = json.loads(tweet.json())
#Printing out the content of a tweet
print (f"\nScraped tweet: {tweet_json['content']}")
#Writing to file
f.write(tweet.json())
f.write('\n')
f.flush()
#Terminate the loop if we reach max_results
if max_results and i > max_results:
break