【发布时间】:2016-12-27 20:22:58
【问题描述】:
我正在抓取一个网站,如果我使用我的浏览器并点击 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
【问题讨论】:
标签: php curl cookies web web-scraping