在抓取异步消息接口时,使用postman工具调试,返回值正常,但使用curl调用时确返回了空串,原因如下;
DEMO:
1 | function curlGet($url) { |
通过在浏览器抓包,得知原地址已经被重定向;
1 | Request URL: https://api.ifcert.org.cn/balanceService/v15/batchMessage?apiKey=325bd8d948ff357e33e0824e65d9207ea82ce89aa7956aba793b817aded645ba&batchNum=CERT20190418005_20190531_86_1559297723000&dataType=1×tamp=1559548379000&nonce=1daae568&sourceCode=CERT20190418005&version=1.5&infType=86 |
如图所示:
解决方法:
- 设置CURLOPT_FOLLOWLOCATION属性(true表示自动进行递归跳转抓取);
- 可选设置CURLOPT_MAXREDIRS数值(表示最多允许跳转多少次后,递归跳转抓取将终止);
1 | curl_setopt($ch, CURLOPT_MAXREDIRS, 20); |
扩展注意:
CURLOPT_FOLLOWLOCATION 需要在安全模式关闭和未设置open_basedir的情况下才能使用。
open_basedir是php.ini中的一项设置,功能是将用户可操作的文件限制在某目录下。
如果开户了安全模式,或者设置了open_basedir抓取方法:
- 抓取头信息,并对header信息的状态码(301,302)进行判断;
- 如果有location,则继续location下一个页面进行抓取;
- 直至状态码为200时再抓取页面信息;
1 | curl_setopt($rch, CURLOPT_HEADER, TRUE); |