curl抓取跳转页面CURLOPT_FOLLOWLOCATION的使用

在抓取异步消息接口时,使用postman工具调试,返回值正常,但使用curl调用时确返回了空串,原因如下;

DEMO:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function curlGet($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$output = curl_exec($ch);
var_dump($output);
curl_close($ch);
}
$url = 'https://api.ifcert.org.cn/balanceService/v15/batchMessage?apiKey=325bd8d948ff357e33e0824e65d9207ea82ce89aa7956aba793b817aded645ba&batchNum=CERT20190418005_20190531_86_1559297723000&dataType=1&timestamp=1559548379000&nonce=1daae568&sourceCode=CERT20190418005&version=1.5&infType=86';

var_dump(curlGet($url));
//结果返回空串了

通过在浏览器抓包,得知原地址已经被重定向;

1
2
3
4
5
Request URL: https://api.ifcert.org.cn/balanceService/v15/batchMessage?apiKey=325bd8d948ff357e33e0824e65d9207ea82ce89aa7956aba793b817aded645ba&batchNum=CERT20190418005_20190531_86_1559297723000&dataType=1&timestamp=1559548379000&nonce=1daae568&sourceCode=CERT20190418005&version=1.5&infType=86
Request Method: GET
Status Code: 302 Found
Remote Address: 202.108.211.130:443
Referrer Policy: no-referrer-when-downgrade
如图所示:

curl抓取跳转页面CURLOPT-FOLLOWLOCATION的使用

解决方法:
  1. 设置CURLOPT_FOLLOWLOCATION属性(true表示自动进行递归跳转抓取);
  2. 可选设置CURLOPT_MAXREDIRS数值(表示最多允许跳转多少次后,递归跳转抓取将终止);
1
2
curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, ture);
扩展注意:

CURLOPT_FOLLOWLOCATION 需要在安全模式关闭和未设置open_basedir的情况下才能使用。
open_basedir是php.ini中的一项设置,功能是将用户可操作的文件限制在某目录下。

如果开户了安全模式,或者设置了open_basedir抓取方法:

  • 抓取头信息,并对header信息的状态码(301,302)进行判断;
  • 如果有location,则继续location下一个页面进行抓取;
  • 直至状态码为200时再抓取页面信息;
1
2
curl_setopt($rch, CURLOPT_HEADER, TRUE);
curl_setopt($rch, CURLOPT_NOBODY, TRUE);
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!