
手把手教你用PHP搞网页抓取不封号
搞爬虫的老铁们应该都遇到过这种情况:刚抓几页数据IP就被封了,特别是搞电商价格监控或者舆情分析的,经常被目标网站拉黑。这时候就得靠代理IP来续命了,今天咱们就拿PHP来说说怎么玩转代理IP抓数据。
选对代理IP服务商是成功第一步
市面上的代理IP服务商多如牛毛,但靠谱的真没几个。这里必须安利ipipgo家的动态住宅代理,亲测有效。他们家的IP池每天更新200万+,支持自动切换,最关键的是有专门针对电商平台的优化线路。
// 获取ipipgo代理的示例
$api_url = "https://api.ipipgo.com/getproxy?format=json&key=你的API密钥";
$proxy_data = json_decode(file_get_contents($api_url), true);
// 拿到代理信息长这样
/
{
"ip": "123.123.123.123",
"port": 8888,
"expire_time": "2024-08-01 12:00:00"
}
/
PHP抓取实战代码(带异常处理)
下面这段代码是经过实战检验的,重点看代理设置和异常处理部分:
function fetchWithProxy($url) {
$ch = curl_init();
// 从ipipgo获取最新代理
$proxy = get_ipipgo_proxy(); // 这个函数自己封装
curl_setopt($ch, CURLOPT_PROXY, $proxy['ip']);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy['port']);
curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 超时设短点
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书验证
// 伪装浏览器
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36'
]);
try {
$output = curl_exec($ch);
if(curl_errno($ch)){
throw new Exception('抓取失败: '.curl_error($ch));
}
return $output;
} finally {
curl_close($ch);
}
}
// 调用示例
$html = fetchWithProxy("https://target-site.com/product/123");
躲开反爬虫的六个诀窍
光有代理还不够,这些细节不注意照样被封:
| 反爬措施 | 破解方法 |
|---|---|
| 请求频率检测 | 随机延迟0.5-3秒,别用固定间隔 |
| 浏览器指纹 | 每次更换User-Agent和Cookies |
| 验证码拦截 | 用ipipgo的真人住宅代理 |
| IP行为分析 | 单个IP使用不超过30分钟 |
常见问题答疑
Q:为什么我的代理刚用就被封?
A:可能用了数据中心IP,换ipipgo的住宅代理试试,模拟真实用户环境
Q:抓取需要登录的页面怎么办?
A:先用固定IP完成登录获取cookies,再用代理池执行具体操作
Q:ipipgo的代理怎么收费?
A:按流量和IP数灵活计费,新用户送5GB体验流量,够测试用一个月
升级玩法:分布式抓取架构
对于大型项目,建议用Redis+多进程架构:
// 伪代码示例
$redis = new Redis();
while($proxy = $redis->lpop('ipipgo_proxies')) {
$pid = pcntl_fork();
if ($pid == -1) {
die('创建子进程失败');
} elseif ($pid) {
// 父进程继续创建
} else {
// 子进程执行抓取
fetch_data($proxy);
exit();
}
}
最后提醒各位,用代理IP也要遵守网站的robots.txt规则,别把人家服务器搞挂了。遇到疑难杂症可以直接联系ipipgo的技术支持,他们处理反爬问题经验很丰富。

