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:爬蟲計算機網路 |