php curl爬虫,如何模拟登录抓取数据?PHP Curl实现模拟登录与数据抓取技巧

🕵️♂️ ​​明明用cURL抓到了登录页,一提交账号却跳回首页!​​ 上周帮朋友扒某电商数据,连续三天卡在 ​​验证码循环陷阱​​ 里——直到发现服务商偷偷加了 ​​“隐身Cookie验证”​​ 。今天用 ​​血泪踩坑实录​​ ,拆解模拟登录的暗门机关👇


一、登录原理:你以为的密码提交,其实是饼干战争

浏览器登录时,服务器不光验证账号密码,还会在后台 ​​塞给你一块饼干(Cookie)​​ 。后续所有操作,服务端都要 ​​检查这块饼干是否新鲜​​ 。

用cURL模拟登录时,很多人直接发账号密码:

php curl爬虫,如何模拟登录抓取数据?PHP Curl实现模拟登录与数据抓取技巧  第1张
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小时变质​​!解决方案:

  1. 首次登录后 ​​解析响应头​​ 提取Set-Cookie

  2. 用正则抓取关键参数如session_id=xxxx

  3. 后续请求 ​​手动附加到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); // 乱序抓取页面

或许暗示:​​慢即是快​​,活得久的爬虫都在“磨洋工”。