我们使用联盟链接。它们让我们能够维持运营,而您无需承担任何费用。

如何抓取 Twitter

我们将为您提供有关如何使用 Python 抓取 Twitter 信息流的分步示例。

如何抓取 Twitter

如果你打算 抓取社交媒体Twitter 是最好的目标平台之一。它每月有 230 亿用户,拥有大量有价值的信息。你可以用很多方法来使用它——从进行情绪分析到发现市场趋势和改进你的营销策略。

尽管 Twitter 非常慷慨地允许访问其数据,但官方 API 需要经过筛选过程,并且施加了相当多的限制。为了克服这些问题,您必须寻找替代方案,而网络抓取是最好的替代方案。

本指南将教您有关 Twitter 抓取的所有知识,向您介绍 API 替代方案以及您在使用过程中可能遇到的挑战。此外,您还将找到一个分步示例,说明如何使用 SNScrape。如果您更喜欢视频,我们也有视频:

什么是 Twitter 抓取 – 定义

Twitter 抓取是一种自动从社交媒体平台收集公共数据的方法。它通常使用预制的抓取工具或定制的网页抓取工具来完成。Twitter 是少数提供官方 API 的平台之一,但使用起来可能很麻烦,因为它限制了您可以获取的推文数量(3,200 条)及其最近时间(最近 7 天)。

社交媒体营销人员利用 Twitter 的受欢迎程度为自己谋利。他们收集信息,例如(转发)推文、分享、URL、点赞、主题和关注者等。抓取 Twitter 信息可以对影响者营销、品牌和声誉监控、情绪分析或市场趋势提供许多见解。

抓取 Twitter 信息合法吗?

尽管没有法规禁止抓取数据,但你必须对抓取社交媒体平台的数据保持警惕,因为事情可能会变得棘手。我们不是律师,但 美国第九巡回上诉法院 规定您可以在以下情况下抓取社交媒体数据:1)数据是公开的(不隐藏在登录后面);2)内容不受知识产权保护。然后,如果您要处理个人信息,可能还有一些其他要求。Twitter 比其他平台拥有更多的自由度;其服务条款 (ToS) 不禁止网页抓取,但您需要事先征得同意。即使在没有帐户的情况下进行抓取时这些条款不具有法律约束力,但您的 IP 地址仍可能会被禁止使用该平台。由于网页抓取的问题并不总是很简单,因此寻求法律建议是个明智的选择。每个用例都会单独考虑:与商业用途相比,您在为研究目的收集数据时会拥有更多的自由。

那么,无需登录就可以抓取哪些数据?

让我们将您可以抓取的 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 数据:分步指南

在这个例子中,我们将使用 SNScrape 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
				
			
Adam Dubois 的图片
亚当·杜波依斯
代理极客和开发人员。