0

当我尝试使用 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/');

我怎么解决这个问题?

4

1 回答 1

0

问题在于服务器设置 cookie 的技术,这是相当特殊的。实际上,它可能是为了防止像您正在做的屏幕抓取,但可能还有其他原因。

服务器显然有两种不同的响应。

  1. 如果没有NSId设置 cookie,则发送一些 Javascript 来设置一个,不发送任何其他内容。
  2. 如果NSId设置了 cookie,则发送页面内容。

cURL 显然可以从服务器接收和设置 cookie,就像您使用以下代码一样:

curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

然而,这假定服务器正在以正常方式设置 cookie,即使用CookieHTTP 标头。因为它是用 Javascript 做的(非常特殊!) cURL 不理解它。

您必须使用以下CURLOPT_COOKIE选项自己设置 cookie:

curl_setopt($ch, CURLOPT_COOKIE, 'NSId=2');

CURLOPT_COOKIE选项设置由 cURL 发送的 cookie 字符串。

于 2013-07-11T11:58:57.677 回答