如何使用Curl携带Cookie登录站点并获取登录后的价格信息
可行解决思路
- 首先补全CSRF令牌获取逻辑:当前绝大多数站点登录表单都带有隐藏的CSRF校验字段,直接提交账号密码会被拦截。你需要先发送GET请求到登录页面,解析响应内容提取表单中隐藏的token字段,将该字段和账号密码一同作为POST参数提交。
- 校验表单提交字段名:使用浏览器F12开发者工具的「网络」面板,查看浏览器正常登录时的POST请求参数,确认字段名是否真为
username和password,部分站点会使用email、user_account、pwd等自定义字段名,字段不匹配会直接触发账号密码错误提示。 - 修正Referer配置:你当前设置的
CURLOPT_REFERER值为$_SERVER['REQUEST_URI'],指向的是你本地脚本的地址,不符合站点的同源校验要求,需要改为登录页地址https://apollohousewares.co.uk/members/login/。 - 替换过时的User-Agent:你当前使用的是Firefox 1.0版本的UA,过于老旧会被站点直接识别为爬虫拦截,替换为你当前本地浏览器的UA即可。
- 开启自动跳转配置:将
CURLOPT_FOLLOWLOCATION设置为1,登录成功后站点通常会返回302跳转,禁止跳转无法正常获取登录后的会话状态。 - 修正Cookie配置:
- 删除手动设置
CURLOPT_COOKIE的代码行,手动指定cookie值会覆盖站点下发的有效会话cookie - 新增
CURLOPT_COOKIEFILE配置,值和CURLOPT_COOKIEJAR一致,第二次请求会员页时才会读取之前存储的登录cookie
- 删除手动设置
- 新增错误校验逻辑:每次
curl_exec执行后打印返回值和HTTP状态码(使用curl_getinfo($ch, CURLINFO_HTTP_CODE)获取),方便定位是参数错误还是被站点拦截。
修改后参考代码
// 账号密码配置 $username = '你的实际账号'; $password = '你的实际密码'; $loginUrl = "https://apollohousewares.co.uk/members/login/"; $targetUrl = "https://apollohousewares.co.uk/members/customers/target/home/"; $cookie_file_path = "cookie.txt"; $ch = curl_init(); // 基础配置 curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_URL, $loginUrl); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); curl_setopt($ch, CURLOPT_REFERER, $loginUrl); // Cookie配置 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); // 第一步:GET登录页获取CSRF令牌 $loginPage = curl_exec($ch); // 这里需要你根据实际表单结构解析隐藏token,示例假设隐藏字段名为csrf_token preg_match('/<input type="hidden" name="csrf_token" value="(.*?)"/', $loginPage, $matches); $csrfToken = $matches[1] ?? ''; // 第二步:提交登录POST请求 $postData = [ 'username' => $username, 'password' => $password, 'csrf_token' => $csrfToken // 替换为实际的token字段名 ]; curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); $loginRes = curl_exec($ch); // 第三步:访问目标会员页 curl_setopt($ch, CURLOPT_URL, $targetUrl); $targetHtml = curl_exec($ch); echo $targetHtml; curl_close($ch);
注意:上述代码中的CSRF字段名需要你根据站点实际的表单结构调整,以浏览器实际抓包的字段为准。
内容的提问来源于stack exchange,提问作者Shashi Bhushan
相关产品推荐
相关产品推荐

