You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Python脚本抓取指定时间段内Twitter页面的全部图片

抓取指定时间段内Twitter页面图片的可行方案

方法一:利用Twitter API v2(稳定可靠)

这种方式是官方支持的,不会触发反爬机制,适合批量抓取。

  1. 准备工作

    • 注册Twitter开发者账号,创建项目并获取Bearer Token
    • 安装依赖库:pip install tweepy requests
  2. 核心代码示例
    先获取指定用户在时间段内的推文,再提取其中的图片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)
    
  3. 注意事项

    • API调用有频次限制,免费版单用户每15分钟最多请求900次
    • 时间必须用UTC格式,精确到秒

方法二:无API的浏览器模拟抓取(适合临时需求)

如果不想申请API,可以用Selenium模拟浏览器操作,但要注意反爬。

  1. 准备工作

    • 安装依赖:pip install selenium requests
    • 下载对应浏览器的驱动(如ChromeDriver)
  2. 核心思路

    • 启动浏览器,打开目标用户的Twitter页面
    • 滚动页面加载所有指定时间段内的推文
    • 解析每个推文的时间戳,筛选符合时间段的内容
    • 提取推文里的高清图片链接并下载
  3. 简化代码示例

    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()
    
  4. 注意事项

    • 滚动间隔时间不要太短,避免被Twitter限制访问
    • 无头模式下可能需要调整浏览器窗口大小,确保元素能被正确识别
    • 若遇到验证码,需要手动处理或添加验证码识别工具

内容的提问来源于stack exchange,提问作者iluvpython12341

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:18