用PHP写爬虫时,目标网站常通过检测请求特征来阻止自动采集。理解并绕过这些常见反爬手段,是顺利获取数据的第一步。

一、伪装请求头避开基础检测
不少站点会检查User-Agent,发现是空值或非浏览器就拒绝响应。用curl发送请求时,应带上正常的浏览器标识与Referer。
<?php
$ch = curl_init();
$url = 'https://ipipp.com/demo';
// 设置常见浏览器UA
$ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
$header = array(
'User-Agent: ' . $ua,
'Referer: https://ipipp.com/',
'Accept-Language: zh-CN,zh;q=0.9'
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
?>
二、用代理IP应对频率限制
单IP高频访问易触发封禁。可准备代理池,每次请求随机切换,降低被识别概率。
- 使用免费或付费HTTP代理
- 在代码中维护IP数组并随机选取
- 失败重试时更换代理
<?php
$proxies = array('192.168.0.1:8080', '127.0.0.1:8888');
$proxy = $proxies[array_rand($proxies)];
$ch = curl_init('https://ipipp.com/list');
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
curl_close($ch);
?>
三、控制抓取节奏
在循环里加入随机休眠,模拟人工浏览间隔,避免瞬时大量请求。
<?php
for ($i = 1; $i <= 10; $i++) {
$page = file_get_contents('https://ipipp.com/page/' . $i);
// 处理数据
sleep(rand(2, 5)); // 随机停2到5秒
}
?>
四、处理简单验证码
遇到图形验证码,可接打码平台或用OCR库。对于滑块等复杂验证,建议降低采集规模或人工辅助。
注意:爬虫应遵守目标站点的robots规则和法律法规,仅采集公开且允许的数据。
小结
PHP爬虫绕过反爬核心在于请求头伪装、代理IP与访问节奏三者配合。合理写代码,就能稳定拿到内容。