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

Python请求TikTok移动端短链接获取video_id时持续超时问题求助

问题描述

需要通过Python获取TikTok移动端短链接(示例:https://vt.tiktok.com/ZS81uRSRR/)对应的video_id,该ID位于规范链接的/video/路径后。

最初使用以下代码通过自动重定向获取规范链接:

import requests
def get_canonical_url(url):
    return requests.get(url, timeout=5).url

代码曾正常运行,后频繁超时,添加Postman复制的Cookie后稳定运行6个月,但上周再次失效,更新Cookie也无法解决,当前报错:

requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.tiktok.com', port=443): Read timed out. (read timeout=5)

奇怪的是,用curl或Postman发送相同请求可正常返回,已尝试更换IP、切换服务器,问题仍存在。

调试建议
  • 完全模拟合法请求头:requests默认请求头与浏览器/curl差异大,会被TikTok反爬拦截。通过curl -v https://vt.tiktok.com/ZS81uRSRR/查看curl的请求头,复制到requests中,关键字段包括User-Agent、Accept、Accept-Language、Referer、Cookie等,示例:
    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",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.5",
        "Cookie": "你的Cookie内容"
    }
    response = requests.get(url, headers=headers, timeout=(3, 15))
    
  • 调整超时参数:原timeout=5可能过短,拆分连接超时和读取超时(如timeout=(3,15)),给服务器足够响应时间。
  • 手动处理重定向:禁用自动重定向,直接提取响应头中的Location字段获取规范链接,避免自动重定向过程中的拦截:
    response = requests.get(url, allow_redirects=False, headers=headers, timeout=(3,15))
    canonical_url = response.headers.get("Location")
    
  • 使用会话保持:创建requests.Session()对象,复用会话状态和Cookie,更贴近真实浏览器的访问模式:
    session = requests.Session()
    session.headers.update(headers)
    response = session.get(url, timeout=(3,15))
    canonical_url = response.url
    
  • 临时关闭SSL验证:若SSL握手导致超时,可临时关闭验证(仅调试用,生产环境不建议):
    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    response = requests.get(url, headers=headers, timeout=(3,15), verify=False)
    
替代获取video_id的方法
  • 直接从跳转链接提取:短链接重定向后的Location头通常直接包含video_id,无需加载完整页面,提取逻辑如下:
    import re
    url = "https://vt.tiktok.com/ZS81uRSRR/"
    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"}
    response = requests.get(url, allow_redirects=False, headers=headers, timeout=(3,15))
    location_url = response.headers.get("Location")
    if location_url:
        video_id = re.search(r"/video/(\d+)", location_url).group(1)
        print(video_id)
    
  • 使用TikTok公开OEmbed接口:TikTok提供用于嵌入的OEmbed接口,返回的JSON数据直接包含video_id,限制较低:
    import requests
    short_url = "https://vt.tiktok.com/ZS81uRSRR/"
    oembed_url = f"https://www.tiktok.com/oembed?url={short_url}"
    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"}
    response = requests.get(oembed_url, headers=headers, timeout=10)
    data = response.json()
    video_id = data.get("video_id")
    
  • 使用第三方爬虫库:如tiktok-scraper(需注意合规性,库可能随TikTok反爬机制更新失效):
    pip install tiktok-scraper
    
    from tiktok_scraper import TikTokScraper
    scraper = TikTokScraper()
    video_info = scraper.get_video_info("https://vt.tiktok.com/ZS81uRSRR/")
    video_id = video_info.get("id")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:25:29