如何使用PHP cURL绕过Cloudflare安全验证获取biorxiv站点数据
故障原因&修复方案
Cloudflare的反爬机制会校验请求的特征、TLS指纹、请求频率等多个维度,Postman发送请求时会自动补全符合浏览器特征的请求头、TLS配置,你的原有cURL请求缺少相关配置,所以被识别为异常请求拦截。
具体修复步骤
- 补全模拟浏览器的请求头,避免被识别为cURL默认请求
- 配置TLS版本和加密套件,匹配普通浏览器的TLS指纹特征
- 开启cookie自动管理,适配Cloudflare的验证cookie下发逻辑
- 控制请求频率,单IP两次请求间隔建议不低于1秒,避免触发频次限制
修复后的完整代码示例
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://www.biorxiv.org/search/electron+microscopy+jcode%3Abiorxiv+limit_from%3A2021-11-08+limit_to%3A2021-11-10+numresults%3A75+sort%3Arelevance-rank+format_result%3Astandard', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', // 新增:模拟Chrome浏览器请求头 CURLOPT_HTTPHEADER => array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8', 'Accept-Encoding: gzip, deflate, br', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' ), // 新增:TLS配置匹配浏览器特征 CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_CIPHER_LIST => 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384', // 新增:开启cookie自动管理 CURLOPT_COOKIEFILE => '', CURLOPT_COOKIEJAR => '' )); $response = curl_exec($curl); curl_close($curl);
补充说明
如果以上配置还是被拦截,可以先在本地浏览器访问目标地址,拿到有效的User-Agent和Cookie值,替换到代码中的对应配置即可正常请求。
内容的提问来源于stack exchange,提问作者King Developer
相关产品推荐
相关产品推荐

