使用Python requests请求站点时报TimeoutError: [Errno 60]超时如何解决
问题原因
- 请求头参数错误:你携带的
Sec-Fetch-Site: same-origin不符合首次跨站请求的浏览器行为,浏览器直接访问外部站点时该字段值为none而非same-origin,错误的请求头被站点WAF/Cloudflare识别为非浏览器请求,直接丢弃数据包导致连接超时。同时Expect: 100-continue头很多站点不兼容,也会触发拦截规则。 - 超时设置过短:你测试时设置的
timeout=0.5对于海外站点来说远远不够,正常跨境请求的延迟就可能超过1秒,加上Cloudflare的校验耗时,短超时会直接判定为请求失败。 - TLS指纹识别:requests库的默认TLS握手特征和真实浏览器有明显差异,Cloudflare等防护机制可以直接识别出脚本请求,即使请求头完全模拟也会被拦截。
解决方法
- 先修正请求头参数,删除不兼容字段,调整错误字段:
headers = { 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'DNT': '1', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_0_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15', 'Sec-Fetch-User': '?1', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9' }
- 调大请求超时时间,建议设置为10~15秒:
response = s.get(url, timeout=15)
- 如果调整后仍然请求失败,说明是TLS指纹被识别,可使用专门适配Cloudflare的
cloudscraper库替换requests,用法和requests完全一致,只需修改初始化逻辑:
# 先执行安装:pip install cloudscraper import cloudscraper s = cloudscraper.create_scraper() s.headers = headers # 后续请求逻辑和原来完全相同
- 若以上方案都无法生效,直接联系对方开发人员,将你的爬虫出口IP添加到Cloudflare/WAF的白名单,或者为你的爬虫规则设置访问豁免即可。
内容的提问来源于stack exchange,提问作者DrPrettyman
相关产品推荐
相关产品推荐

