当我尝试用CURL获取markafoni.com的html数据时,它会返回
<script>
document.cookie = 'NSId=2;expires=Sun, 17-Jan-2038 01:00:00 GMT';
location.reload(true);
</script><noscript>%90'a varan indirim Markafoni'de</noscript>
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER,true);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_COOKIESESSION,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt($ch, CURLOPT_REFERER, 'http://www.markafoni.com/');
curl_setopt($ch, CURLOPT_URL, 'https://www.markafoni.com/');
我该如何解决这个问题?
问题在于服务器设置cookie的技术,这是非常特殊的。事实上,它可能是为了防止像你所做的那样刮屏,但可能还有其他原因。
服务器显然有两种不同的响应。
- 如果没有设置
NSId
cookie,则发送一些Javascript来设置一个,而不发送其他cookie - 如果设置了
NSId
cookie,则发送页面内容
cURL显然可以从服务器接收和设置cookie,就像您使用以下代码所做的那样:
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
然而,这假设服务器以正常方式设置cookie,即使用Cookie
HTTP标头。因为它是用Javascript(非常特殊!)cURL不理解它。
您必须使用CURLOPT_COOKIE
选项自己设置cookie:
curl_setopt($ch, CURLOPT_COOKIE, 'NSId=2');
CURLOPT_COOKIE
选项设置由cURL发送的cookie字符串。