如何编写Python脚本抓取指定时间段内Twitter页面的全部图片
抓取指定时间段内Twitter页面图片的可行方案
方法一:利用Twitter API v2(稳定可靠)
这种方式是官方支持的,不会触发反爬机制,适合批量抓取。
准备工作
- 注册Twitter开发者账号,创建项目并获取
Bearer Token - 安装依赖库:
pip install tweepy requests
- 注册Twitter开发者账号,创建项目并获取
核心代码示例
先获取指定用户在时间段内的推文,再提取其中的图片URL并下载:import tweepy import requests import os # 配置API密钥 BEARER_TOKEN = "你的Bearer Token" USERNAME = "目标Twitter用户名" START_TIME = "2023-01-01T00:00:00Z" # UTC时间格式 END_TIME = "2023-12-31T23:59:59Z" SAVE_DIR = "twitter_images" # 创建保存目录 os.makedirs(SAVE_DIR, exist_ok=True) # 初始化API客户端 client = tweepy.Client(bearer_token=BEARER_TOKEN) # 获取用户ID user = client.get_user(username=USERNAME) user_id = user.data.id # 分页获取指定时间段的推文 tweets = tweepy.Paginator( client.get_users_tweets, id=user_id, start_time=START_TIME, end_time=END_TIME, expansions="attachments.media_keys", media_fields="url", max_results=100 ) # 提取并下载图片 media_map = {} for response in tweets: if response.includes and response.includes.get("media"): for media in response.includes.get("media"): if media.type == "photo": media_map[media.media_key] = media.url for tweet in response.data: if tweet.attachments and tweet.attachments.get("media_keys"): for key in tweet.attachments.get("media_keys"): img_url = media_map.get(key) if img_url: img_name = img_url.split("/")[-1] img_path = os.path.join(SAVE_DIR, img_name) # 下载图片 with open(img_path, "wb") as f: f.write(requests.get(img_url).content)注意事项
- API调用有频次限制,免费版单用户每15分钟最多请求900次
- 时间必须用UTC格式,精确到秒
方法二:无API的浏览器模拟抓取(适合临时需求)
如果不想申请API,可以用Selenium模拟浏览器操作,但要注意反爬。
准备工作
- 安装依赖:
pip install selenium requests - 下载对应浏览器的驱动(如ChromeDriver)
- 安装依赖:
核心思路
- 启动浏览器,打开目标用户的Twitter页面
- 滚动页面加载所有指定时间段内的推文
- 解析每个推文的时间戳,筛选符合时间段的内容
- 提取推文里的高清图片链接并下载
简化代码示例
from selenium import webdriver from selenium.webdriver.common.by import By import time import requests import os from datetime import datetime USER_URL = "https://twitter.com/目标用户名" START_DATE = datetime(2023, 1, 1) END_DATE = datetime(2023, 12, 31) SAVE_DIR = "twitter_images_no_api" os.makedirs(SAVE_DIR, exist_ok=True) # 初始化浏览器(建议添加无头模式和反爬配置) options = webdriver.ChromeOptions() options.add_argument("--headless=new") options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=options) driver.get(USER_URL) # 滚动加载页面 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) new_height = driver.execute_script("return document.body.scrollHeight") # 检查是否加载完所有内容,或是否超出目标时间段 tweets = driver.find_elements(By.XPATH, '//article[@data-testid="tweet"]') oldest_tweet_time = tweets[-1].find_element(By.XPATH, './/time').get_attribute('datetime') oldest_date = datetime.fromisoformat(oldest_tweet_time.replace("Z", "+00:00")) if oldest_date < START_DATE or new_height == last_height: break last_height = new_height # 筛选并下载图片 for tweet in tweets: tweet_time = tweet.find_element(By.XPATH, './/time').get_attribute('datetime') tweet_date = datetime.fromisoformat(tweet_time.replace("Z", "+00:00")) if START_DATE <= tweet_date <= END_DATE: # 提取高清图片链接(Twitter图片后缀?format=jpg&name=4096x4096是高清版) img_elements = tweet.find_elements(By.XPATH, './/img[@data-testid="tweetPhoto"]') for img in img_elements: low_res_url = img.get_attribute('src') high_res_url = low_res_url.replace("?format=jpg&name=small", "?format=jpg&name=4096x4096") img_name = high_res_url.split("/")[-1].split("?")[0] img_path = os.path.join(SAVE_DIR, img_name) with open(img_path, "wb") as f: f.write(requests.get(high_res_url).content) driver.quit()注意事项
- 滚动间隔时间不要太短,避免被Twitter限制访问
- 无头模式下可能需要调整浏览器窗口大小,确保元素能被正确识别
- 若遇到验证码,需要手动处理或添加验证码识别工具
内容的提问来源于stack exchange,提问作者iluvpython12341
相关产品推荐
相关产品推荐

