使用file_get_contents和curl获取无效Cookie的问题求助
我之前也碰到过一模一样的情况!浏览器能拿到有效Cookie,但用PHP的file_get_contents或者curl抓的就没用,大概率是请求头不完整、Cookie处理逻辑有问题,或者站点做了基础的反爬校验。咱们一步步来排查:
1. 先修复你的file_get_contents代码里的Cookie收集bug
你现在的代码每次匹配到Set-Cookie头就直接覆盖$cookies变量,但一个请求可能返回多个Cookie(比如session_id、csrf_token之类的),最后只保留了最后一个,这肯定会导致Cookie不全失效。
修改这段代码:
$cookies = array(); foreach ($http_response_header as $hdr) { if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) { // 把每个Cookie追加到数组,而不是覆盖 $cookies[] = $matches[1]; } } // 最后拼接成标准的Cookie字符串 return implode('; ', $cookies);
2. 补全请求头,模拟真实浏览器
浏览器发送的请求头远不止Accept和User-Agent,很多站点会校验Referer、Accept-Language这些字段,缺失的话可能返回无效Cookie或者直接拒绝。把你的context header补全:
$context = array( 'http' => array( 'method' => 'GET', 'header' => array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/63.0.3239.84 Chrome/63.0.3239.84 Safari/537.36', 'Referer: ' . $url, // 加上当前URL作为Referer 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive' ), 'follow_location' => true, // 自动跟随重定向,很多站点会跳转后才设置有效Cookie 'max_redirects' => 5 // 限制最大重定向次数,避免死循环 ) );
3. 换用curl,用CookieJar自动管理Cookie
curl对Cookie的处理比file_get_contents成熟得多,尤其是用CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE可以自动保存和复用Cookie,不用手动解析Set-Cookie头,避免遗漏属性(比如domain、path、过期时间):
$ch = curl_init($url); // 模拟浏览器UA curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/63.0.3239.84 Chrome/63.0.3239.84 Safari/537.36'); // 补全请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Referer: ' . $url, 'Connection: keep-alive' )); // 启用CookieJar:自动保存Cookie到文件,下次请求自动读取 curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/your_cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/your_cookies.txt'); // 自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 返回响应内容而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); // 如果需要手动提取Cookie字符串 $cookieList = curl_getinfo($ch, CURLINFO_COOKIELIST); $cookieString = ''; foreach ($cookieList as $cookie) { $parts = explode("\t", $cookie); $cookieString .= $parts[5] . '=' . $parts[6] . '; '; } $cookieString = rtrim($cookieString, '; '); curl_close($ch); return $cookieString;
4. 极端情况:站点有JS生成的Cookie
如果上面的方法都没用,那可能目标站点的Cookie是通过JavaScript生成的(比如一些反爬的动态Cookie),这时候file_get_contents和curl都没法处理,因为它们不执行JS。这种情况得用无头浏览器(比如PHP版的Puppeteer)来模拟真实浏览器的渲染过程,才能拿到有效Cookie。
先试试前三种方法,大部分情况都能解决问题!
内容的提问来源于stack exchange,提问作者Dhiraj
相关产品推荐
相关产品推荐

