Twitter作为主流社交平台,拥有丰富的公开数据源。合理利用数据爬取可以实现情感分析、趋势监测等目的。本教程将手把手教你如何使用Python的SNScrape库爬取Twitter。
什么是 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,并结合Twitter 代理来避免您的 IP 被阻止。
如果您不喜欢干扰代码,可以使用商业无代码爬取工具,例如 PhantomBuster 和 ParseHub。这些可视化工具提供方便的模板或点击式界面。虽然简单的任务很容易完成,但一旦规模扩大,它们就会变得越来越复杂和低效。
最后,您可以使用预制的 Twitter 网络爬取库之一。这些工具允许您通过在代码编辑器或命令行中输入命令来提取数据。它们不需要 API 身份验证或代理即可工作。SNScrape 就是一个例子;Twint 曾经是另一个,但已不再维护。
如何使用 Python 爬取 Twitter 数据:分步指南
本文将以示例代码为基础,为您详细讲解如何使用Python的SNScrape库来爬取Twitter公开数据,包括搜索结果、用户资料、主题标签等信息。我们会一步一步进行,确保初学者也能轻松上手。
SNScrape概述
在本示例中,我们将使用SNScrape Python 库来爬取 Twitter 。这是 Twitter 爬取的热门选择,因为:
SNScrape是一个Python库,可以帮助我们爬取Twitter上公开可见的数据。相比Twitter API,它的优势在于:
- 不受推文数量限制的约束
- 可以爬取超过7天的历史数据
- 使用简单,无需API认证
SNScrape包含不同的模块用于爬取Twitter的各个方面,比如搜索结果、用户资料等。它可以爬取的数据包括:
- 搜索结果
- 用户资料
- 主题标签
- 单条推文
- 推文线程
- 列表帖子
- 趋势等
接下来我们就通过详细的代码示例来看看如何使用SNScrape。+
准备工作
使用SNScrape前,需要通过pip安装它:
pip install snscrape
然后创建一个python文件,例如twitter_scraper.py,作为我们的代码编辑文件。
导入需要的模块:
from snscrape.modules import twitter import json
- snscrape.modules.twitter: SNScrape中的Twitter爬虫模块
- json: 用于解析和处理JSON格式数据
爬取Twitter搜索结果
Twitter的搜索结果页面包含针对某一搜索词的相关推文。要爬取搜索结果,我们可以这样编写:
# 搜索词 query = 'python' # 爬取函数 def scrape_search(query): scraper = twitter.TwitterSearchScraper(query) return scraper
这里我们定义了搜索词”python”,并创建了一个scrape_search函数,它会使用TwitterSearchScraper来爬取搜索结果。
在主循环中,我们遍历爬取结果,并做解析与输出:
for item in scraper.get_items(): # 转换为JSON格式 json_data = json.loads(item.json()) # 打印输出推文内容 print(json_data['content']) # 保存结果到文件 with open(output_file, 'w') as f: f.write(item.json())
这里我们定义了搜索词”python”,并创建了一个scrape_search函数,它会使用TwitterSearchScraper来爬取搜索结果。
在主循环中,我们遍历爬取结果,并做解析与输出:
for item in scraper.get_items(): # 转换为JSON格式 json_data = json.loads(item.json()) # 打印输出推文内容 print(json_data['content']) # 保存结果到文件 with open(output_file, 'w') as f: f.write(item.json())
- 首先将item转换为JSON格式,才能访问数据字段
- 然后我们打印了推文的内容
- 同时还把结果保存到了文件中
添加数量限制:
if max_results and i > max_results: break
这样我们就实现了一个简单的Twitter搜索结果爬虫。运行它就可以爬取关键词”python”的搜索结果了。
爬取Twitter标签
如果要爬取使用特定标签的推文,可以使用TwitterHashtagScraper:
hashtag = 'python' def scrape_hashtag(hashtag): scraper = twitter.TwitterHashtagScraper(hashtag) return scraper
将上例中的TwitterSearchScraper替换为TwitterHashtagScraper,传入标签名称,就可以爬取包含该标签的推文。
标签名称不需要添加#符号。其他的解析与输出过程同搜索结果。
爬取Twitter用户资料
要爬取某个用户的资料和推文,可以通过用户名或用户ID实现:
username = 'PythonWeekly' def scrape_user(username): scraper = twitter.TwitterUserScraper(username) return scraper
这里我们先定义了要爬取的用户名,然后创建了scrape_user函数,通过TwitterUserScraper来爬取用户数据。
将上例中的搜索函数替换为该函数,就可以爬取指定用户的资料了。
爬取Twitter单条推文
有时我们只需要爬取某一条推文的内容,这时可以直接通过推文的ID来实现:
tweet_id = 1523456789 def scrape_tweet(tweet_id): scraper = twitter.TwitterTweetScraper(tweet_id) return scraper
TwitterTweetScraper会按照给定的ID抓取对应的推文。其余的数据解析逻辑同上。
综上所述,我们可以得出一个完整的Twitter爬虫脚本:
from snscrape.modules import twitter import json # 搜索词 query = 'python' # 用户名 username = 'PythonWeekly' # 推文ID tweet_id = 1523456789 # 爬取搜索结果 def scrape_search(query): scraper = twitter.TwitterSearchScraper(query) return scraper # 爬取用户资料 def scrape_user(username): scraper = twitter.TwitterUserScraper(username) return scraper # 爬取推文 def scrape_tweet(tweet_id): scraper = twitter.TwitterTweetScraper(tweet_id) return scraper for item in scraper.get_items(): # 解析JSON json_data = json.loads(item.json()) # 输出 print(json_data['content']) # 保存结果 with open(file, 'w') as f: f.write(item.json()) # 数量限制 if max_results and i > max_results: break
通过上面的示例,我们学习了如何使用SNScrape的不同模块来爬取Twitter的搜索结果、标签、用户和推文。
Scrapy的优势在于使用简单,可以方便地抓取公开的数据,不受限制。遵循类似的代码范式,你就可以爬取Twitter上的各类数据。
上面给出的只是一个基础的示例,你还可以添加代理、用户验证等功能来丰富你的Twitter爬虫。
常见问题
Without API key运行吗?
是的,SNScrape不需要任何API密钥就可以运行。
可以爬历史数据吗?
可以爬取7天以前的推文。
可以保存哪些字段?
推文内容、日期、用户名等各种字段可以保存为JSON。
如何避免被封号?
添加时间延迟,不要大量高频爬取,使用代理IP等方法。
是否可以爬取私密账户?
不能,只能爬取公开信息。