深入分析noedjs爬蟲中出現的亂碼情況
上一篇文章中分析了目前沒有能夠解決的亂碼的三種情況,今天就這三種情況分析一下背後的原因。
1,網頁原始碼中的編碼方式和抓包得到的編碼方式不一致問題,這個有可能是故意為之,為了反爬蟲之類的。當然也有可能是在配置伺服器的時候出錯了。
2,由content-Encoding欄位為gzip導致的問題:
客戶端和瀏覽器進行通訊的協商過程中存在Accept-Encoding欄位,摘錄RFC2616中關於該欄位的定義如下:
Examples of its use are:
Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
A server tests whether a content-coding is acceptable, according to an Accept-Encoding field, using these rules:
1. If the content-coding is one of the content-codings listed in the Accept-Encoding field, then it is acceptable, unless it is accompanied by a qvalue of 0. (As defined in section 3.9, a qvalue of 0 means “not acceptable.”)
2. The special “*” symbol in an Accept-Encoding field matches any available content-coding not explicitly listed in the header field.
3. If multiple content-codings are acceptable, then the acceptable content-coding with the highest non-zero qvalue is preferred.
4. The “identity” content-coding is always acceptable, unless specifically refused because the Accept-Encoding field includes “identity;q=0”, or because the field includes “*;q=0” and does not explicitly include the “identity” content-coding. If the Accept-Encoding field-value is empty, then only the “identity” encoding is acceptable.
If an Accept-Encoding field is present in a request, and if the server cannot send a response which is acceptable according to the Accept-Encoding header, then the server SHOULD send an error response with the 406 (Not Acceptable) status code.
If no Accept-Encoding field is present in a request, the server MAY assume that the client will accept any content coding. In this case,if “identity” is one of the available content-codings, then the server SHOULD use the “identity” content-coding, unless it has additional information that a different content-coding is meaningful to the client.
因此在針對www.guoguo-app.com進行爬蟲的時候設定了兩次不同的Accept-Encoding,效果如下:
GET / HTTP/1.1
Accept-Charset: gbk
Host: www.guoguo-app.com
Connection: close
HTTP/1.1 200 OK
Date: Fri, 07 Apr 2017 05:16:22 GMT
Content-Type: text/html;charset=GBK
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Vary : Accept-Encoding
Content-Language: zh-CN
Server: Tengine/Aserver
GET / HTTP/1.1
Accept-Charset: gbk
Accept-Encoding: gzip
Host: www.guoguo-app.com
Connection: close
HTTP/1.1 200 OK
Date: Fri, 07 Apr 2017 05:21:53 GMT
Content-Type: text/html;charset=GBK
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Content-Language: zh-CN
Content-Encoding: gzip
Server: Tengine/Aserver
可以看到當客戶端顯示的指出可以接受gzip的時候,伺服器給與了gzip的響應,而預設的情況是不經過壓縮的。
但是針對andersonjiang.blog.sohu.com網站就沒有那麼順利了,如下所示:
GET / HTTP/1.1
Accept-Encoding: gzip;q=1.0
Host: andersonjiang.blog.sohu.com
Connection: close
HTTP/1.1 200 OK
Content-Type: text/html; charset=GBK
Transfer-Encoding: chunked
Connection: close
Server: nginx
Date: Fri, 07 Apr 2017 05:36:10 GMT
Vary: Accept-Encoding
Expires: Thu, 01 Jan 1970 00:00:00 GMT
RHOST: [email protected]
Pragma: No-cache
Cache-Control: no-cache
Content-Language: en-US
Content-Encoding: gzip
FSS-Cache: MISS from 13998460.19372422.21936590
FSS-Proxy: Powered by 9935166.11245896.17873234
GET / HTTP/1.1
Accept-Encoding: *;q=0
Host: andersonjiang.blog.sohu.com
Connection: close
HTTP/1.1 200 OK
Content-Type: text/html; charset=GBK
Transfer-Encoding: chunked
Connection: close
Server: nginx
Date: Fri, 07 Apr 2017 05:59:08 GMT
Vary: Accept-Encoding
Expires: Thu, 01 Jan 1970 00:00:00 GMT
RHOST: [email protected]
Pragma: No-cache
Cache-Control: no-cache
Content-Language: en-US
Content-Encoding: gzip
FSS-Cache: MISS from 13998460.19372422.21936590
FSS-Proxy: Powered by 10131777.11639115.18069848
第二次的時候表示客戶端不接受任何形式的壓縮編碼,但是服務端卻仍然以壓縮形式返回,這種情況是不符合標準RFC的規定的,因此針對這種情況只有編寫解壓縮程式,方可提取到想要的網頁內容。
由上可以看出,伺服器端給不給出壓縮或者非壓縮的網頁,完全取決於伺服器段行為,並沒有完全遵守RFC 給出的建議和規定。
3,網頁編碼導致的亂碼問題。
客戶端和瀏覽器進行通訊的協商過程中存在Accept-Charset欄位,摘錄RFC2616中關於該欄位的定義如下:
An example is
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
The special value ““, if present in the Accept-Charset field,matches every character set (including ISO-8859-1) which is not mentioned elsewhere in the Accept-Charset field. If no “” is present in an Accept-Charset field, then all character sets not explicitly mentioned get a quality value of 0, except for ISO-8859-1, which gets a quality value of 1 if not explicitly mentioned.
If no Accept-Charset header is present, the default is that any character set is acceptable. If an Accept-Charset header is present,and if the server cannot send a response which is acceptable according to the Accept-Charset header, then the server SHOULD send an error response with the 406 (not acceptable) status code, though the sending of an unacceptable response is also allowed.
GET / HTTP/1.1
Accept-Charset: gbk;q=0
Accept-Encoding: *;q=0
Host: www.guoguo-app.com
Connection: close
HTTP/1.1 200 OK
Date: Fri, 07 Apr 2017 06:23:12 GMT
Content-Type: text/html;charset=GBK
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Vary: Accept-Encoding
Content-Language: zh-CN
Server: Tengine/Aserver
GET / HTTP/1.1
Accept-Charset: utf-8;q=1
Accept-Encoding: *;q=0
Host: www.guoguo-app.com
Connection: close
HTTP/1.1 200 OK
Date: Fri, 07 Apr 2017 06:25:57 GMT
Content-Type: text/html;charset=GBK
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Vary: Accept-Encoding
Content-Language: zh-CN
Server: Tengine/Aserver
可以看到客戶端要求的utf8編碼,但是服務端的Content-Type卻是GBK。
由上面可以看出,使用’Accept-Charset’: ‘gbk’,’Accept-Encoding’: ‘gzip’等頭部請求的時候,雖然客戶端聲明瞭自己所支援的編碼方式以及,解壓縮方式,但是伺服器段並沒有按照客戶端的要求返回對應的編碼和壓縮方法。但是正常情況下,可以加上述的兩個協商欄位,當伺服器有選擇的時候,則會返回我們請求的方式。
本文為CSDN村中少年原創文章,轉載記得加上小尾巴偶,博主連結這裡。
相關推薦
深入分析noedjs爬蟲中出現的亂碼情況
上一篇文章中分析了目前沒有能夠解決的亂碼的三種情況,今天就這三種情況分析一下背後的原因。 1,網頁原始碼中的編碼方式和抓包得到的編碼方式不一致問題,這個有可能是故意為之,為了反爬蟲之類的。當然也有可能是在配置伺服器的時候出錯了。
客戶端提交資料給伺服器端,如果資料中帶有中文的話,有可能會出現亂碼情況
request: 如果是GET方式 程式碼轉碼 String username = request.getParameter("username"); String password = request.getParameter("password"); String use
php寫入數據到mysql數據庫中出現亂碼解決方法
names .com http image alt ima utf8 情況 mysql 亂碼情況: 在選擇數據庫前加入一句代碼即可 mysql_query("set names utf8"); 最後效果 php寫入數據到mysql數據庫中出現亂碼解決方法
php中出現亂碼
瀏覽器 blog src alt 1-1 .cn 出現 瀏覽器中 技術 對於初學著來說,編輯中文php時,會出現亂碼 在php代碼中加入 隨後在瀏覽器中,就會看到如下頁面 這樣就解決了php 中文亂碼的問題。php中出現亂碼
深入分析Java規範中JVM的記憶體佈局模型
Java是一門結合了編譯執行與解釋執行的語言。首先,Java編譯器把Java原始碼編譯成Java位元組碼(byte-code),然後,Java位元組碼在Java虛擬機器(JVM)上解釋執行。實際上,Java虛擬機器在執行Java程式碼的過程中,會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域
關於Linux環境下應用生成圖片中出現亂碼的問題處理
緣由:測試環境和生產環境系統字符集都是LANG=en_US.utf8,程式在測試環境通過下述方式生成的圖片裡面的中文可以正常顯示,生產環境不行,排查原因為生產環境確認對應的字型,採取後續方法增加字型。 1、C:\Windows\Fonts下找到字型檔案simsun.ttc,重新命名為sim
位址列中文引數在頁面中出現亂碼問題
專案中碰到一個問題: 在搜尋框寫入中文資料在傳送請求時,同時跳轉到另外一個page,把獲取的中文資料寫入input的value中。但是獲取到中文的資料變成亂碼 <input class="input_page" /> 解決辦法: 請求時
寫爬蟲總是出現亂碼,習慣不好所以謝謝筆記
寫爬蟲有時候需要靜態頁面 就不得不把頁面下載下來,但是 寫入的時候總是出現一些奇怪的亂碼 或者不能寫入比如: ’gbk’ codec can’t encode character ‘\xa0’ in position 4877: illegal multibyt
用Scrapy抓取的中文字元匯出到csv中出現亂碼
背景 按照這篇文章學些Scrapy框架,爬取豆瓣電影Top250的資訊,將資訊匯入到本地csv檔案時,由於電影名稱是中文,儲存時出現了亂碼。 解決辦法 在setting檔案中加入這樣一行語句: FEED_EXPORT_ENCODING = ‘utf-8-sig’ 儲存se
eclipse 控制檯中文輸出出現亂碼情況及解決
今天向eclipse中匯入了一個專案,我的eclipse本身預設編碼方式是UTF-8,而這個專案的編碼是gbk,所以很自然的,程式碼檔案中的中文變成了亂碼,於是右擊專案名稱,點選-->Properties,將檔案編碼改成gbk.。(這種方式哦是將該專案的編碼方式改變,其
關於spring boot 前臺訪問後臺過程中出現亂碼的解決方案
近日在開發spring boot 應用,發現將程式碼遷移到新的機器之後出現了在前臺進行業務的新增和編輯 輸入框輸入中文後,傳到後臺服務時全是亂碼(全是問號)經過一番排查之後得並不是因為資料庫編碼的問題,也不是tomcat encodeUrl 的編碼設定問題,而是因為機器環境本
C/C++字串中出現‘\’的情況
A common typing error is to place the hands on the keyboard one row to the right of the correct position. So "Q" is typed as "W" and "J" is typed as "K
vs code中出現亂碼現象
如上圖是我敲好程式準備編譯時出現的錯誤,此時單擊UTF-8.點選 通過編碼儲存 找到gbk選中完成後 顯示正常 下圖是改過後執行介面。這樣就修改成功了!!!下面是有關gbk和UTF-8編碼方式的簡
java中出現亂碼的解決辦法
第一: 首先: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=U
安卓框架,分析解決專案中出現的anr
07-16 15:31:47.551 E/ActivityManager( 1775): Reason: Input dispatching timed out (Waiting because the focused window's input ch
spring 傳送郵件中的亂碼情況
只是在網上找了些資料,經過實踐發現好使,加了些備註。 編碼 郵件頭(參見RFC822,RFC2047)只能包含US-ASCII字元。郵件頭中任何包含非US-ASCII字元的部分必須進行編碼, 使其只包含US-ASCII字元。所以使用java mail傳送中文郵件必須經過編碼
SELECT的結果中出現"亂碼"的解決方案--【葉子】
--測試資料 declare @table table (colname varchar(8)) insert into @table select '微•博' union all select '團•購' union all select '裸•婚' union all s
關於cmd執行java程式出現亂碼情況解決辦法
中午在執行一個程式時(我用的notepad++),突然出現亂碼,然後百度之後知道很多像我一樣的新手都遇到過這樣的問題。話不多說上解決辦法: 辦法:開啟notepad++,點選視窗上方的 “編碼” 選項,然後選下邊的 “轉為ANSI” 選項,重啟cmd,按照步驟執行程式
js檔案中的中文提示資訊發到jsp中出現亂碼解決步驟
.js檔案建立預設是gbk編碼,該js檔案中如果有中文,在utf-8的jsp頁面中,顯示改中文,為亂碼! 解決方法: 1--將原來.js檔案中的內容全部複製到剪貼簿中; 2--修改js檔案的編碼格式為utf-8; 3--將剪貼簿中的內容黏貼到原來的js檔案覆蓋原有內
tomcat日誌中出現亂碼
開發十年,就只剩下這套架構體系了! >>>