前几天帮朋友调一个采集脚本,浏览器能打开的接口,用代码一抓就返回空,折腾半天发现就是参数没设对。玩过抓取的都知道,初始化之后真正干活的就是这个函数,所有超时、头信息、跳转都靠它一句一句交代清楚。
curl_setopt到底管什么事
可以把它理解成给本次请求下指令的遥控器。第一个参数是刚建好的会话句柄,第二个是要设的选项名,第三个是选项值。常见套路是先定地址,再定是否返回字符串,然后处理超时和证书。比如抓取普通页面,基本三行就能跑起来,地址配好后记得把返回结果开关打开,不然页面直接输出到屏幕,变量里拿不到东西。
新手最常用的几个选项组合
地址选项负责目标链接,返回开关决定拿字符串还是直接输出,请求头选项可以伪装成浏览器。很多站点会拦默认请求头,加上一句常见浏览器标识,通过率立刻上去。需要提交表单就打开提交开关,再把拼接好的字段传进去。下载文件时配合文件指针用,边下边写,内存占用小很多。
超时和跳转两处最容易踩坑
默认等待时间很长,接口挂了脚本会卡半天,所以连接超时和总超时都要设,比如连接5秒,总共15秒。遇到短链和登录后跳转,还要打开跟随跳转开关,并限制最多跳5次,不然遇到循环跳转会一直转。测试环境证书不全时,有人会关掉证书校验,线上千万别这么干,中间人攻击就是这么来的。
返回空和乱码怎么查
先打印错误编号和错误信息,再看返回码是不是200。乱码多半是编码问题,对照响应头转一次编码就行。调不通时把详细开关打开,所有握手和头信息全打出来,问题藏不住。记住每次用完关闭会话,长脚本里不关闭会把连接数吃光。
- 固定起手式:定地址、开返回、设超时,三件套先写好再加别的
- 伪装请求头:被拦先加浏览器标识,别急着怀疑代码
- 线上别关证书校验:测试图方便可以,发布前一定改回去
curl_init('http://example.com/api')curl_setopt(句柄, CURLOPT_URL, 'http://example.com/api')curl_setopt(句柄, CURLOPT_RETURNTRANSFER, 1)curl_setopt(句柄, CURLOPT_TIMEOUT, 15)curl_setopt(句柄, CURLOPT_FOLLOWLOCATION, 1)curl_setopt(句柄, CURLOPT_USERAGENT, 'Mozilla/5.0')curl_exec(句柄)curl_errno(句柄)curl_close(句柄)