当站点需要启用cookie时,PHP CURL请求失败


PHP CURL Request Failing When Site Requires Cookies Enabled

我试图从纽约时报网站上的一篇新闻文章中抓取元数据,特别是http://www.nytimes.com/2014/06/25/us/politics/thad-cochran-chris-mcdaniel-mississippi-senate-primary.html

每当我尝试,然而,我得到重定向从视线,因为我的"浏览器"不接受cookie。我已经启用了curl选项来保存cookie,并尝试在其他几个StackOverflow问题(这里,这里和这里)中遵循公认的答案,虽然答案在这些网站上工作,但在nytimes网站上似乎不起作用。

我当前的php curl函数是这样的:

function get_extra_meta_tags_curl($url) {
    $ckfile = tempnam("/public_html/commentarium/", "cookies.txt");
    $ch = curl_init($main_url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $output = curl_exec($ch);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output;
}

问题似乎是当我请求URL时,nytimes.com检查浏览器是否接受cookie。在重定向到带有REFUSE_COOKIE_ERROR的登录页面之前,我检查了几次。这里不贴完整的重定向列表你可以在我的测试页面上看到它以及最终重定向返回的原始html以及CURL测试下当前get_extra_meta_tags_curl函数返回的内容

谢谢你的帮助!

您以错误的方式启用cookie自动处理。CURLOPT_COOKIEJAR只启用cookie保存(存储),但您还需要启用cookie加载并通过请求传递它们(通过CURLOPT_COOKIEFILE选项)。否则,cookie自动处理将无法工作,您将遇到"浏览器不接受cookie"的问题。

所以你必须将CURLOPT_COOKIEJARCURLOPT_COOKIEFILE选项设置为相同的值($ckfile)在每个 CURL请求:

...
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
...