之前对某境外网站挂上clash代理后能正常访问,后来突然发现挂上代理后请求返回状态码403
,但是奇怪的是相同的url、请求头和请求体,使用requests可以请求成功,使用scrapy则请求失败,百思不得其解,本来想通过打开fiddler
抓包测试,结果发现打开fiddler后竟然又能访问成功了,响应状态码200
,后续发现是TLS协议问题,只需要在scrapy的settings里加入下面两行代码:
DOWNLOADER_CLIENT_TLS_METHOD = "TLSv1.2"
DOWNLOADER_CLIENT_TLS_CIPHERS = "DEFAULT"
第一行代码:
- 功能:指定 Scrapy 在 HTTPS 请求中使用的 TLS 协议版本。
- 参数说明:
- TLSv1.2:强制使用 TLS 1.2 版本(推荐值,安全性和兼容性较好)。
- 其他可选值:TLSv1(TLS 1.0,安全性较低)、TLSv1_3(TLS 1.3,安全性更高,但部分服务器可能不支持)。
- 作用:如果服务器支持指定的版本,则使用该版本建立加密连接;否则连接可能失败。
第二行代码:
- 功能:指定 Scrapy 在 TLS 握手时支持的加密套件(Ciphersuites)列表。
- 参数说明:
- DEFAULT:使用 Python 的ssl模块默认的加密套件列表(通常包含主流安全的加密算法)。
- 自定义值:例如ECDHE-RSA-AES256-GCM-SHA384,可手动指定特定加密套件(不推荐,可能导致兼容性问题)。
- 作用:客户端和服务器会从支持的加密套件中协商出一个共同支持的套件,用于后续数据加密。
为什么需要这些设置?
- 安全性:TLS 1.0/1.1 已被认为不安全(如易受 POODLE 攻击),建议使用 TLS 1.2+。
- 兼容性:某些服务器可能仅支持特定 TLS 版本或加密套件,需根据目标网站调整。
- 调试需求:在网络环境不稳定或遇到 TLS 握手失败时,可通过调整这些参数排查或遇到 TLS 握手失败时,可通过调整这些参数排查问题。