记录curl_cffi使用https代理访问的坑

记录在工作学习中遇到指纹框架curl_cffi的坑

问题起始

我们常用的爬虫框架为requests,但是遇到一些校验指纹的网站,单纯使用该框架则会使接口返回403.
python也有众多可以提供校验指纹的包,如curl_cffi,tls_client,pyhttpx等,根据实际网站需求选择合适的指纹框架。
在某网站的爬虫中,我使用curl_cffi在本地使用框架连接本地端口的代理时访问正常,但是上传至服务器后使用代理ip网站的代理时会报如下错误:

curl_cffi.requests.errors.RequestsError: Failed to perform, curl: (77) error setting certificate verify locations: CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.

从报错信息中推测是由于https证书路径不正确,于是我设置verify为False,同样无济于事。然后我查看服务器文件,发现目录中并无/etc/ssl/certs/ca-certificates.crt文件,并且进入/etc/ssl/certs/文件夹会被软连接定位到/etc/pki/tls/certs/,于是我尝试在/etc/pki/tls/certs/文件夹下创建ca-certificates.crt空文件,可惜也没什么作用。
查看源代码得知/etc/ssl/certs/ca-certificates.crt为ubuntu系统路径,但是服务器为centos系统,路径应为/etc/pki/tls/certs/ca-bundle.crt.然后我尝试设置verify="/etc/pki/tls/certs/ca-bundle.crt"和curl路径为/etc/pki/tls/certs/ca-bundle.crt都报这个错。
由此推测应该不是文件路径的问题,我就百思不得其解,查询很多方案无果后准备放弃了。然后在查看官方文档后发现作者在设置代理时是这些设置的:

# 支持使用代理
proxies = {"https": "http://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome110", proxies=proxies)

proxies = {"https": "socks://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome110", proxies=proxies)

没错,他的https设置的代理是http协议,我最开始以为是他写错了。一般requests使用代理请求时会如下设置代理:

LOCAL_PROXY = {
    'https': 'https://ip:port',
    'http': 'http://ip:port',
}

如此request会根据你访问的url的协议来自动set代理,如果没有则为本机ip。后来我死马当活马医,尝试了一下,还真是这样设置。后来看其他帖子和文档好像是因为默认是http什么的,需要设置https什么什么的,这个我也不太清楚,但是curl_cffi这样设置就能正常访问了,可喜可贺。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值