PHP抓网页必备:DOMDocument保姆级教学
搞数据采集的老铁们应该都遇到过这个难题:目标网站把HTML结构改得亲妈都不认识,写好的爬虫脚本直接罢工。今儿咱们就用PHP自带的DOMDocument组件,手把手教你怎么优雅拆解网页结构,再搭配ipipgo的代理IP服务,保证采集稳如老狗。
一、为啥要用代理IP搞数据抓取?
很多网站都装了”门禁系统”,同一个IP频繁访问立马拉黑。这时候就需要像ipipgo这样的专业代理服务,好比给爬虫准备了一堆”替身演员”。举个栗子:
$proxy = 'http://username:password@gateway.ipipgo.io:9020';
$context = stream_context_create([
'http' => ['proxy' => $proxy]
]);
$html = file_get_contents('目标网址', false, $context);
这段代码里的gateway.ipipgo.io就是他们的智能路由入口,自动分配最适合的节点。实测用他家代理后,被封概率从80%降到5%以下。
二、DOMDocument基础操作三板斧
拿到网页源码后,咱们开始拆解零件:
$dom = new DOMDocument();
@$dom->loadHTML($html); // 用@屏蔽警告信息
$xpath = new DOMXPath($dom);
// 示例:抓取所有商品价格
$prices = $xpath->query('//span[@class="price"]');
foreach ($prices as $node) {
echo $node->nodeValue."";
}
注意这两个坑:
1. 网页编码问题用mb_convert_encoding处理
2. 用@符号忽略HTML解析错误
三、实战:动态网站采集方案
遇到用JS加载数据的网站,可以配合代理IP做分布式采集。比如这样配置采集集群:
节点类型 | 并发数 | 切换策略 |
---|---|---|
国内住宅IP | 10线程 | 每次请求换IP |
海外数据中心IP | 5线程 | 每小时换IP |
用ipipgo的API获取IP池:
$ip_list = json_decode(file_get_contents('https://api.ipipgo.com/getips?type=http&num=20'));
四、常见问题急救包
Q:代理IP连不上咋整?
A:先检查认证信息格式,用ipipgo后台提供的”连接测试”工具诊断
Q:XPath写对了但抓不到数据?
A:八成是网页里有iframe,先用正则定位到具体框架再解析
Q:采集速度突然变慢?
A:可能触发了网站限速,建议在代码里加随机等待时间:
sleep(rand(1, 3)); // 随机睡1-3秒
五、ipipgo的隐藏福利
除了基础代理服务,他家还有两个杀手锏:
1. 智能重试系统:自动切换失效IP
2. 数据清洗接口:自动过滤重复内容
最后给个忠告:别在采集代码里用sleep(0),网站风控不是吃素的。用代理IP+随机延迟+自动切换的三重防护,才能让采集脚本长命百岁。