php curl爬虫,如何模拟登录抓取数据?PHP Curl实现模拟登录与数据抓取技巧
🕵️♂️ 明明用cURL抓到了登录页,一提交账号却跳回首页! 上周帮朋友扒某电商数据,连续三天卡在 验证码循环陷阱 里——直到发现服务商偷偷加了 “隐身Cookie验证” 。今天用 血泪踩坑实录 ,拆解模拟登录的暗门机关👇
一、登录原理:你以为的密码提交,其实是饼干战争
浏览器登录时,服务器不光验证账号密码,还会在后台 塞给你一块饼干(Cookie) 。后续所有操作,服务端都要 检查这块饼干是否新鲜 。
用cURL模拟登录时,很多人直接发账号密码:

php复制$data = ['user'=>'admin', 'pass'=>'123456']; // 新手经典错误❌ curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
结果服务器怒回 “无效会话” ——因为你没带上它上次给的饼干!
💡 破局关键:
› 先 空访问登录页 收割Cookie(像领入场券)
› 提交账号密码时 把饼干贴回去
› 登录成功后 保存饼干 用于后续抓取
二、四步攻防战:破解验证码+会话劫持
▶️ 第一步:暗渡陈仓(绕过人机验证)
某些网站即使正确提交Cookie,也会被 隐形人机检测拦截 。实测发现:在请求头里 伪造触摸屏参数 可降拦截率:
php复制// 关键头信息设置 curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: Mozilla/5.0 (iPad; CPU OS 16_6 like Mac OS X) AppleWebKit/604.1.50 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1','X-Touch-Capable: true' // 暗示触控设备]);
⚠️ 坑点警报:
某平台会检测 光标移动轨迹,纯cURL难以模仿——这时候可能需要上 无头浏览器 。
▶️ 第二步:偷梁换柱(会话维持术)
登录成功后,用 文件型Cookie 保存会话:
php复制// 保存Cookie到文件 curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');// 后续请求加载Cookie curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
但部分平台 饼干24小时变质!解决方案:
首次登录后 解析响应头 提取
Set-Cookie
值用正则抓取关键参数如
session_id=xxxx
后续请求 手动附加到Cookie头
三、致命陷阱:登录成功却抓不到数据的元凶
▶️ 场景复现
明明登录返回了200状态码,但抓用户中心时总跳转到登录页——这或许暗示 重定向追杀 。
✅ 反制方案:
› 开启 CURLOPT_FOLLOWLOCATION
自动跳转
› 但需配合 CURLOPT_MAXREDIRS
限制跳转次数(防 *** 循环)
php复制curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允许跳转 curl_setopt($ch, CURLOPT_MAXREDIRS, 3); // 最多跳3次
不过话说回来... 某些平台用 JavaScript跳转,cURL根本看不懂!这时候得用 DOM解析器提取meta跳转链接 。
▶️ 盲区预警:
最近发现某电商平台新增 “双Cookie校验”:
首次登录生成 主会话ID
二次操作要求 验证子令牌(藏在CSS文件里!)
具体机制还在研究中...
四、实战沙盘:30行代码攻破电商后台
以抓取订单数据为例:
php复制// 1. 初始化并收割Cookie $ch = curl_init();curl_setopt($ch, CURLOPT_URL, "https://mall.com/login");curl_setopt($ch, CURLOPT_COOKIEJAR, 'cook.txt');curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$loginPage = curl_exec($ch); // 收割初始Cookie // 2. 提交登录(带验证码) $captcha = solve_captcha($loginPage); // 验证码识别函数 $data = http_build_query(['user' => 'my_account','pass' => 'p@ssw0rd','captcha' => $captcha]);curl_setopt($ch, CURLOPT_URL, "https://mall.com/login_action");curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);$result = curl_exec($ch); // 登录结果 // 3. 登录后立即访问订单页 if (strpos($result, '欢迎回来')) {curl_setopt($ch, CURLOPT_URL, "https://mall.com/orders");curl_setopt($ch, CURLOPT_HTTPGET, true); // 切换GET请求 $orders = curl_exec($ch);file_put_contents('orders.html', $orders);}curl_close($ch);
💥 避坑重点:
› 登录页和提交页的 域名可能不同(如提交到auth.mall.com
)
› 提交后立即访问新页面时,必须保持同一个cURL句柄(会话连续性)
五、 *** 酷真相:90%封号源于贪心
服务器其实能 通过鼠标轨迹检测机器人,但通常 懒得管小规模爬虫。不过当你的请求出现以下特征:
每秒请求超过 3次(人类无法达到的速度)
访问路径 完全线性(如连续爬商品页1~100)
从不加载 图片/CSS(省带宽暴露非人性)
运维就会按下 封杀按钮!解决方案:
php复制// 随机延时 + 混淆路径 sleep(rand(1, 5)); // 随机睡1~5秒 $page = mt_rand(1, 10); // 乱序抓取页面
或许暗示:慢即是快,活得久的爬虫都在“磨洋工”。