
PHP爬虫为啥总被封?试试这招灵得很
搞过网页抓取的弟兄们都知道,用PHP写爬虫最头疼的就是IP被封。上个月有个做电商比价的小哥找我,说他的脚本跑不到半小时就歇菜,换了三台服务器都不顶用。这事儿啊,说白了就是没用好代理IP这个神器。
// 典型被封的爬虫代码
$html = file_get_contents('https://目标网站.com');
上面这种直连方式就像拿大喇叭喊”我是爬虫”,不封你封谁?咱们得学会用代理IP来打掩护。
手把手教你用代理IP写爬虫
先说个真事:我帮那个电商小哥换成代理IP方案后,连续跑了三天都没出问题。这里用ipipgo的代理服务举个栗子,他们家的接口简单得很:
$proxy = 'http://username:password@gateway.ipipgo.com:9020';
$context = stream_context_create([
'http' => [
'proxy' => $proxy,
'request_fulluri' => true
]
]);
$html = file_get_contents('目标网址', false, $context);
注意这几个坑别踩:
- ① 账号密码记得换成自己在ipipgo后台拿到的
- ② 不同代理类型(HTTP/HTTPS/SOCKS5)要选对端口
- ③ 超时设置最好别超过10秒
实战技巧:让爬虫活得久的三板斧
| 招数 | 怎么做 | 推荐设置 |
|---|---|---|
| IP轮换 | 每次请求换不同代理 | ipipgo的动态套餐 |
| 请求间隔 | 随机休眠1-5秒 | sleep(rand(1,5)) |
| Header伪装 | 模拟浏览器信息 | 设置User-Agent |
举个带自动换IP的完整例子:
function getProxyList() {
// 这里调用ipipgo的API获取最新代理池
return json_decode(file_get_contents('https://api.ipipgo.com/proxy_pool'));
}
$retry = 3;
while($retry--) {
$proxies = getProxyList();
foreach($proxies as $proxy) {
try {
// 设置代理并发送请求
$html = doRequest($targetUrl, $proxy);
// 处理数据...
break;
} catch(Exception $e) {
// 记录失败日志
continue;
}
}
}
常见问题QA
Q:代理IP用着用着失效咋整?
A:选ipipgo这种能自动更换IP池的服务商,他们家每分钟更新2000+新IP,根本用不完
Q:HTTPS网站抓取要注意啥?
A:记得在代码里加这两句:
stream_context_set_default([ 'ssl' => ['verify_peer' => false] ]);
不过正规做法应该配置CA证书,具体可以找ipipgo的技术支持要方案
Q:怎么判断代理是否真有效?
A:写个心跳检测脚本,定期访问https://api.ipipgo.com/check_ip这个接口,返回状态码200说明IP可用
最后说个掏心窝的话:爬虫这玩意就是和网站搞持久战。用对代理IP就像穿了防弹衣,省心不是一星半点。特别是做大规模数据采集的,直接上ipipgo的企业版套餐,有专人帮你调试配置,比自己折腾强多了。

