今天在幹壞事抓取別人頁面時候遇到一個問題,平時咱們在post數據後,大不了要求提交cookie,可是今天這個測試了N遍不須要coookie都行的,可是抓取到的始終是亂碼,怎麼解析都不行。因而本身又把cookie和一大堆header給加上,仍是一樣的問題,因而開始鬱悶了。PHP腳本不行,可是一樣的提交瀏覽器上面就行,這個是怎麼回事呢?
因而開始分析能看到的數據,終於看到一個特別的地方,咱們平時請求數據的時候都會在header裏面看到一個php
Coontent-Length: xxxx
這個是表示此次發送的數據的長度,說明是一個完整的http數據的發送,可是今天看到的這個卻沒有這一項,出現的倒是html
Transfer-Encoding chunked
因而開始鬱悶了,這個究竟是啥意思。谷歌了一番終於懂了,也找到對策了。
維基百科上面是這樣解釋的:瀏覽器
分塊傳輸編碼(Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,容許HTTP由網頁服務器發送給客戶端應用( 一般是網頁瀏覽器)的數據能夠分紅多個部分。分塊傳輸編碼只在HTTP協議1.1版本(HTTP/1.1)中提供。
一般,HTTP應答消息中發送的數據是整個發送的,Content-Length消息頭字段表示數據的長度。數據的長度很重要,由於客戶端須要知道哪裏是應答消息的結束,以及後續應答消息的開始。然而,使用分塊傳輸編碼,數據分解成一系列數據塊,並以一個或多個塊發送,這樣服務器能夠發送數據而不須要預先知道發送內容的總大小。一般數據塊的大小是一致的,但也不老是這種狀況。服務器
終於知道這個是啥了,那邊把數據給分段了,怪不得數據一直有問題,因而網上處處找解決辦法,終於找到一個很巧妙的方法:使用HTTP 1.0協議,服務器會主動放棄chunked編碼,因此在curl裏面加個cookie
curl_setopt($curl, CURLOPT_HTTP_VERSION, '1.0');
問題就解決了,就是這麼簡單app