如何从推文链接下载附带图片?Twitter API付费后的Python实现方案
如何从推文链接下载图片
一、手动下载方法(无需代码)
- 打开目标推文链接,找到附带的图片并点击进入全屏查看模式
- 右键点击图片,选择「图片另存为」(不同浏览器选项略有差异),即可将图片保存到本地
- 若推文包含多张图片,重复上述步骤逐个保存即可
二、Python实现(无需付费Twitter API)
Twitter API不再免费后,可通过网页抓取方式获取图片链接并下载,以下是两种可行方案:
方案1:使用requests + BeautifulSoup(适用于静态加载推文)
此方法适合简单的单图/多图推文,若推文内容为动态渲染则可能失效。
- 安装依赖包:
pip install requests beautifulsoup4
- 示例代码:
import requests from bs4 import BeautifulSoup import os def download_tweet_images(tweet_url, save_dir="tweet_images"): # 创建保存目录 os.makedirs(save_dir, exist_ok=True) # 模拟浏览器请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } try: # 获取推文网页内容 response = requests.get(tweet_url, headers=headers) response.raise_for_status() # 解析HTML结构 soup = BeautifulSoup(response.text, "html.parser") # 定位推文图片元素 img_elements = soup.find_all("img", attrs={"data-testid": "tweetPhoto"}) if not img_elements: print("该推文未附带图片") return # 批量下载图片 for idx, img in enumerate(img_elements): img_url = img.get("data-src") or img.get("src") if not img_url: continue # 转换为高清原图链接(替换缩略图标识) if "?" in img_url: img_url = img_url.split("?")[0] img_url = img_url.replace("small", "orig").replace("medium", "orig").replace("large", "orig") # 下载并保存图片 img_response = requests.get(img_url, headers=headers) img_response.raise_for_status() img_name = f"tweet_img_{idx+1}.jpg" save_path = os.path.join(save_dir, img_name) with open(save_path, "wb") as f: f.write(img_response.content) print(f"图片已保存:{save_path}") except Exception as e: print(f"下载出错:{str(e)}") # 使用示例 tweet_link = "https://twitter.com/xxx/status/xxxxxx" download_tweet_images(tweet_link)
方案2:使用selenium(适用于动态渲染推文)
若静态抓取无法获取图片,说明内容由JavaScript动态加载,可通过selenium模拟浏览器操作解决。
- 安装依赖包:
pip install selenium
需额外下载对应浏览器的驱动(如ChromeDriver),并确保其路径在系统环境变量中。
- 示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By import os import time import requests def download_tweet_images_selenium(tweet_url, save_dir="tweet_images"): os.makedirs(save_dir, exist_ok=True) # 配置Chrome浏览器选项(无头模式不显示窗口) options = webdriver.ChromeOptions() options.add_argument("--headless=new") options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options) try: driver.get(tweet_url) time.sleep(3) # 等待页面完全加载 # 定位推文图片元素 img_elements = driver.find_elements(By.CSS_SELECTOR, 'img[data-testid="tweetPhoto"]') if not img_elements: print("该推文未附带图片") return # 批量下载图片 for idx, img in enumerate(img_elements): img_url = img.get_attribute("data-src") or img.get_attribute("src") if not img_url: continue # 转换为高清原图链接 if "?" in img_url: img_url = img_url.split("?")[0] img_url = img_url.replace("small", "orig").replace("medium", "orig").replace("large", "orig") # 下载图片 headers = {"User-Agent": options.arguments[1].split("=")[1]} img_response = requests.get(img_url, headers=headers) img_response.raise_for_status() img_name = f"tweet_img_{idx+1}.jpg" save_path = os.path.join(save_dir, img_name) with open(save_path, "wb") as f: f.write(img_response.content) print(f"图片已保存:{save_path}") except Exception as e: print(f"下载出错:{str(e)}") finally: driver.quit() # 使用示例 tweet_link = "https://twitter.com/xxx/status/xxxxxx" download_tweet_images_selenium(tweet_link)
注意事项
- 频繁抓取可能触发Twitter反爬机制,建议添加合理延时,避免短时间内大量请求
- 请严格遵守Twitter服务条款,勿用于批量抓取或商业用途
- Twitter网页结构可能随时变更,若代码失效需根据最新HTML结构调整元素选择器
内容的提问来源于stack exchange,提问作者Yash Khasgiwala
相关产品推荐
相关产品推荐

