python爬蟲中文編碼的問題?

這是實習僧的python結果頁面,請問這種亂碼該怎麼處理?


謝邀。好像有點意思,把網址發出來,我看看


[流量預警,6張圖]

初步分析了下,應該是用了自定義字體。以前沒怎麼見過,只聽別人說過, 很好奇,就分析了以下,還是很好破的,請看我的分析過程:

首先,看網頁源碼:

這種形式應該是字元的某種編碼,和字體文件是一一對應的,分析css後發現他用了myFont這個字體,並找到了這個字體的定義,base64編碼的,

為了確認一開始的假設,把這段css複製出來,寫一個html測試(限於篇幅,base64編碼省略了):

然後瀏覽器里打開:

能正常顯示,證明假設是對的,就是這個字體文件。

現在,我的想法是能把這個字體文件裡面所有的字和編碼對應關係表拿到,就能對付亂碼問題了。

先要把base64編碼過的文件轉換成文件,先把base64編碼部分(從d09GRgABAAAAA開始到jO7Tgg==)複製後保存到文件(font.base64)

import base64
base64.decode(open("font.base64","rb"), open("fff","wb"))

現在得到了真正的字體文件,但不知道格式,沒法分析。

二進位文件一般開頭都有一些magic number來說明文件的類型,用十六進位編輯器打開文件(其實記事本也可以),

看到前四個字元是wOFF,搜索後得知這是一個woff格式的字體,

這下就簡單了,找個woff字體編輯器就好了,搜了半天,發現都好麻煩,各種安裝程序,還是國外的,速度好慢。

無意間找到這個FontEditor,百度的(百度搜索時竟然沒有,在Google上找到的)

在線的,賊好用。

直接點open上傳字體文件,就看到了所有字,他把常用的字弄這個裡面了。

現在,就有了字和編碼關係對應表。

想一次拿到編碼還是有點小問題,複製好麻煩,可以在Chrome的Console里用js來干這事

//這個頁面用了JQ,所以直接用,很方便
$(".glyf-item ").each( function(){
console.log($(this).find("div.unicode").attr("title"));
//這裡只是輸出了,可以放數組裡,方便一次複製
})

然後,把對應關係放字典里,替換就好了。

字典應該長這樣

{
"eb6d": "0",
"e196": "1",
"e15c": "2",
.........
}

舉個列子:

html里的 #xe196 編碼部分是e196 拿到編碼直接用dict["e196"]就能得到真正的字。

提供一種轉換思路:

&>&>&> import re
&>&>&> s="#xe15c#xeb6d#xe196#xf43a"
&>&>&> d = {"e15c": "2", "eb6d": "0", "e196": "1", "f43a": "7" }
&>&>&>fs = re.sub(r"#xw{4}", lambda m: "{" + m.group()[3:] + "}", s)
&>&>&>fs
"{e15c}{eb6d}{e196}{f43a}"
&>&>&>fs.format(**d)
"2017"

到此就可以解析出文本了。寫的有些亂,不懂的地方歡迎追問。

附全部字體

最後提一下,我今年大三(2018屆),希望能找一份關於Python爬蟲或Python web方面的暑期實習(兩個月),如有需求,請私我,不勝感激。


decode和encode兩個函數自己在網上查一下就會了


推薦閱讀:

一份優秀的網路爬蟲工程師簡歷是怎麼樣的?
Python 爬蟲進階?
對於一些加密的動態網頁的數據採集,除了通過phantomjs還有沒有別的通用的方法?
如何避免「用隱形鏈接」的反爬蟲技術?
使用Hadoop能做哪些比較有趣的事情?

TAG:爬蟲計算機網路 |