手把手教你用PHP抓数据不封IP
搞数据采集的兄弟都懂,最头疼的就是目标网站突然给你来个IP封禁。上个月我帮客户抓某电商平台价格,刚跑两天就收到403警告,这时候就得祭出代理IP这个大杀器了。
基础装备准备
先整个能用的PHP环境,确认curl扩展装好了。这里有个坑要注意:有些服务器默认没开curl,得自己到php.ini里去掉extension=curl前面的分号。
if (!function_exists('curl_init')) {
die('快去把curl扩展打开!');
}
裸奔式采集代码
先看个不戴防护的代码长啥样:
$url = 'https://target-site.com/data';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
这么搞不出半小时准被封,特别是采集频率高的时候。上周有个哥们儿用这种写法,半小时换了6个服务器IP,气得直接摔键盘。
给代码穿个防弹衣
重点来了!给curl挂上ipipgo的代理,代码要改成这样:
$proxy = 'proxy.ipipgo.com:9021'; //这里填ipipgo提供的通道
$auth = 'username:password'; //后台生成的认证信息
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $auth);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
//...其他设置保持不动
注意三个关键点:
1. 代理地址要带端口号,别漏了
2. 认证信息不是网站账号,是ipipgo后台独有的
3. 超时设短点,15秒足够大部分场景用了
实战避坑指南
最近帮客户部署时遇到的真实情况:
症状 | 解决方法 |
---|---|
返回空白页 | 检查代理地址是否带协议头(http/https) |
经常超时 | 在ipipgo控制台切换线路区域 |
速度不稳定 | 开启自动切换IP功能,间隔设30秒 |
老司机经验包
1. 采集量大的时候,建议用ipipgo的动态住宅代理,亲测日均10万请求不翻车
2. 重要项目别用免费代理,上次有人贪便宜,结果采集到全是广告代码
3. 设置User-Agent伪装浏览器,但别用太热门的,容易被识破
常见问题QA
Q:代理IP突然失效怎么办?
A:在ipipgo后台开启”故障自动切换”,系统会秒级切换新IP
Q:怎么判断代理是否生效?
A:在代码里加curl_getinfo($ch, CURLINFO_PRIMARY_IP)查看实际出口IP
Q:高并发采集怎么处理?
A:用ipipgo的API动态获取代理池,每个线程分配独立IP,记得控制请求频率
最后说个血泪教训:某次没检查代理可用性,导致采集到全是错误数据。后来发现ipipgo有提供在线检测工具,现在每次开工前都先跑个检测脚本,省心多了。