
搞PHP爬虫为啥总被封?试试这招灵的很
最近好多兄弟问,用PHP写的小爬虫老是被目标网站封IP,气得想砸键盘。这事儿说白了就是你的网络指纹太明显,今天教你们个绝招——用代理IP打掩护。就像玩捉迷藏不断换马甲,让网站抓不住你的真身。
选家伙有讲究 工具别乱用
新手最爱用file_get_contents,但这就跟裸奔没区别:
$html = file_get_contents("http://目标网站");
老手都用CURL套装,好比穿上了防弹衣:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://目标网站");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
代理IP才是保命符
在curl配置里加这几行,立马变身:
curl_setopt($ch, CURLOPT_PROXY, '代理IP:端口');
// 如果用ipipgo的动态隧道
curl_setopt($ch, CURLOPT_PROXY, 'http://用户名:密码@gateway.ipipgo.com:端口');
注意每次请求都要换IP,ipipgo的API能实时获取最新IP,像这样:
$ip_list = json_decode(file_get_contents('https://api.ipipgo.com/get?num=5'));
$random_ip = $ip_list[rand(0,4)];
实战案例:抢限量商品
去年帮朋友写抢鞋脚本,不用代理5分钟就凉凉。后来用ipipgo的独享IP池,成功秘诀在这:
function stealth_request($url){
$ch = curl_init();
// 从ipipgo获取当日有效IP
$proxy = get_ipipgo_proxy();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 超时设短点
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0'
]);
return curl_exec($ch);
}
避坑指南(收藏备用)
| 症状 | 解药 |
|---|---|
| 突然返回空白 | 立即切换ipipgo的下个IP节点 |
| 出现验证码 | 降低请求频率+更换User-Agent |
| 连接超时 | 检查代理端口是否填错 |
小白必看QA
Q:免费代理不能用吗?
A:市面免费代理10个有9个是坑,要么速度慢要么早失效。ipipgo的商用级代理有专人维护,实测成功率98%以上。
Q:怎么知道代理生效了?
A:在代码里加个检查:
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
if(curl_exec($ch) === false) {
echo "代理 $proxy 挂了,换下一个!";
}
Q:遇到网站反爬怎么破?
A:三个诀窍:①用ipipgo的住宅代理 ②随机休眠0.5-3秒 ③混合使用手机/PC的UA头
升级玩法:分布式爬虫
大型项目记得用多线程+代理池,这样配置:
// 从ipipgo获取200个IP存Redis
$ip_pool = get_ipipgo_batch(200);
// 每个线程取不同IP
$worker->setProxy(array_pop($ip_pool));
注意要监控IP可用率,低于90%时自动触发IP更换。
最后说句实在话,代理IP这玩意儿一分钱一分货。自打用了ipipgo,再也不用半夜爬起来换IP,系统自动维护池子,省下的时间够睡个安稳觉了。有兄弟说贵,但比起被封号导致的损失,这点投入真不算啥。

