手把手教你用PHP抓数据
搞数据采集最怕啥?当然是IP被封啊!辛辛苦苦写的脚本跑两下就被目标网站拉黑,这种破事我见多了。今天就教你们用原生CURL配合ipipgo的代理IP,搞个稳如老狗的采集方案。
基础CURL配置要搞懂
先整明白PHP的CURL基础设置,这段代码是采集的根基:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "目标网址"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch);
重点注意:记得加超时设置!建议CURLOPT_TIMEOUT设20秒,CURLOPT_CONNECTTIMEOUT设15秒,别让脚本卡死。
代理IP的正确打开姿势
直接上ipipgo的代理配置代码,这才是保命的关键:
curl_setopt($ch, CURLOPT_PROXY, '代理IP:端口'); curl_setopt($ch, CURLOPT_PROXYUSERPWD, '账号:密码');
用ipipgo的轮换代理池时,建议每次请求都换新IP。他们的API获取方式贼简单:
$ip = file_get_contents('https://api.ipipgo.com/getproxy');
实战防封技巧大公开
操作 | 普通模式 | 代理模式 |
---|---|---|
日采集量 | 500条 | 50万+ |
存活时间 | 2小时 | 长期稳定 |
被封概率 | 90% | <5% |
重点技巧:记得在header里加随机User-Agent,ipipgo的代理IP池自带这个功能,省心得很。
异常处理别马虎
采集脚本不加异常处理,就像开车不系安全带。必加的三重保险:
- curl_errno()检查网络错误
- http_code判断响应状态
- 设置自动重试机制
if(curl_errno($ch)){ file_put_contents('error.log', date('Y-m-d H:i:s').' 错误:'.curl_error($ch)."", FILE_APPEND); }
QA常见问题解答
Q:代理IP突然失效咋整?
A:用ipipgo的智能切换功能,他们的API返回的都是验证过的可用IP
Q:采集速度慢怎么办?
A:试试他们的独享高速代理线路,记得调大CURL的并发参数
Q:需要采集境外网站怎么办?
A:ipipgo有全球200+国家的静态住宅IP,选对应地区节点就行
升级版采集方案
给要搞大规模采集的朋友支个招:用ipipgo的API+Redis搞IP池管理,代码结构大概这样:
$redis = new Redis(); $ipList = $redis->lRange('proxy_pool',0,-1); foreach($ipList as $proxy){ // 这里放采集逻辑 // 采集失败自动剔除当前IP }
记得设置定时任务,每天凌晨自动通过ipipgo的API补充新鲜IP,保证池子里随时有50+可用代理。
最后说句掏心窝的,选代理服务别图便宜。之前用过几家便宜的,10个IP能有8个失效的。后来换ipipgo的铂金套餐,贵是贵点,但胜在稳定,业务量直接翻了3倍。他们那个智能路由功能是真香,自动匹配最快线路,省了不少调试时间。