如何用Python的Tweepy从推文URL提取并下载图片、视频等媒体内容
使用Tweepy提取并下载推文的图片与视频
当然可以通过Tweepy库获取推文中的图片、视频等媒体内容,不过需要先完成Twitter API的认证(得申请开发者账号,拿到Bearer Token等凭证)。以下是具体的实现步骤:
1. 安装Tweepy
先确保你安装了最新版本的Tweepy:
pip install tweepy
2. 提取推文ID并获取媒体数据
首先从推文URL里提取推文ID——比如推文URL是https://twitter.com/xxx/status/1234567890,那ID就是1234567890。然后用Tweepy的v2 API(推荐,v1.1版本逐渐被弃用)获取推文的媒体信息:
import tweepy # 替换成你的Bearer Token BEARER_TOKEN = "你的Bearer Token" # 初始化客户端 client = tweepy.Client(bearer_token=BEARER_TOKEN) # 替换成目标推文的ID tweet_id = "1234567890" # 请求推文的媒体字段,展开media_keys获取详细媒体数据 response = client.get_tweet( tweet_id, expansions="attachments.media_keys", media_fields="type,url,variants" ) # 整理媒体数据到字典,方便通过media_key匹配 media_map = {media.media_key: media for media in response.includes.get('media', [])} # 获取推文里的媒体key列表 media_keys = response.data.attachments.get('media_keys', []) if hasattr(response.data, 'attachments') else [] media_list = [media_map[key] for key in media_keys if key in media_map]
3. 区分媒体类型并下载
推文里的媒体主要分图片、视频、动图三种,需要分别处理下载链接:
import requests def save_media(media_url, save_path): """通用的媒体下载函数""" with requests.get(media_url, stream=True) as r: r.raise_for_status() with open(save_path, 'wb') as f: for chunk in r.iter_content(chunk_size=1024): f.write(chunk) for media in media_list: if media.type == 'photo': # 图片直接取url字段 img_path = f"{tweet_id}_pic_{media.media_key}.jpg" save_media(media.url, img_path) print(f"图片已保存:{img_path}") elif media.type in ['video', 'animated_gif']: # 视频/动图需要选比特率最高的变体(质量最好) valid_variants = [v for v in media.variants if 'bit_rate' in v] if valid_variants: # 按比特率降序排序,取第一个 best_variant = sorted(valid_variants, key=lambda x: x['bit_rate'], reverse=True)[0] video_path = f"{tweet_id}_vid_{media.media_key}.mp4" save_media(best_variant['url'], video_path) print(f"视频/动图已保存:{video_path}")
注意事项
- 确保你的Twitter开发者账号有足够的权限(至少需要读取推文的权限)
- 隐私推文(用户设置了保护)的媒体无法通过API获取
- 视频的下载链接带有临时签名,有效期不长,建议获取后立即下载
- 遵守Twitter API的调用限制,避免频繁请求导致限流
内容的提问来源于stack exchange,提问作者Paul Johny
相关产品推荐
相关产品推荐

