记录在工作学习中遇到指纹框架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这样设置就能正常访问了,可喜可贺。