使用CURLOPT_COOKIE

时间:2016-08-21 00:49:36

标签: php curl cookies web web-scraping

我正在抓取一个网站,如果我使用我的浏览器并点击T.O.S.,该页面会在我的浏览器中设置一个如下所示的cookie:

名称 OnCoreWeb

AutoLoadImages = -1& ImageViewer = 2& DefaultNumberOfRows = 10

Cookie名称是OnCoreWeb,但该值是一个&符号分隔的三个键/值对的字符串。

当我在cURL中发送cookie时,我构造它是这样的:

curl_setopt($ch, CURLOPT_COOKIE, "OnCoreWeb={AutoLoadImages=0&ImageViewer=0&DefaultNumberOfRows=50});

但是当我输出标题时,Set-Cookie似乎在第一个cookie的末尾添加了一个额外的值对,如下所示:

HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Set-Cookie: OnCoreWeb={AutoLoadImages=0&ImageViewer=0&DefaultNumberOfRows=50}&AutoLoadImages=-1; expires=Mon, 21-Aug-2017 00:36:44 GMT; path=/
X-Powered-By: ASP.NET

日期:太阳,2016年8月21日00:36:44 GMT

您可以看到在Set-Cookie行中,在结束&AutoLoadImages=-1;之后附加}。这让我觉得我的cookie格式错误。

作为一个控件,我已经注释掉所有COOKIEJAR和COOKIEFILE行,因此唯一的cookie设置是通过CURLOPT_COOKIE属性完成的。

正如我想到的那样,我想你可以说cookie VALUE只是一个字符串,并且解析是在服务器端完成的,所以将字符串包装在{}中并不会真正神奇地将字符串变成一个数组。有了这个理念,我也尝试将字符串包裹在''' (双单引号),也没有任何区别。我想我应该尝试删除{}或''总而言之,因为cookie值仅仅是一个字符串,并且&符号并不意味着客户端的东西。服务器端决定使用"&"解析字符串。作为分隔符。

奇怪的是,就像那样,删除{}或''在cookie值字符串周围包装,额外的,多余的&AutoLoadImages=-1;消失了。

新标题显示正确,如下所示:

HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=yqtxvba24xodegufrkoih355; path=/; HttpOnly
Set-Cookie: OnCoreWeb=AutoLoadImages=0&ImageViewer=0&DefaultNumberOfRows=50; expires=Mon, 21-Aug-2017 17:35:12 GMT; path=/
X-Powered-By: ASP.NET
Date: Sun, 21 Aug 2016 17:35:12 GMT

1 个答案:

答案 0 :(得分:0)

如果在AutoLoadImages Http响应中嗅探http标头你发现Set-Cookie两次,那只是因为服务器行为。

恕我直言这个数据cookie编码看起来有点奇怪,我同意它看起来像是错误的,但鉴于它是服务器端行为,我们不能假设它。

我建议您尝试浏览网站,看看您会收到哪种类型/格式的数据。