【日常&問題解決】如何處理部分帶有十六進制(以UTF-8編碼爲例)的文本轉化處理

日前出遊餘杭,閒暇偶得此文。幸遇習緣君,方知此生不枉,欲與君同。

問題發現

這個問題起源於我用於刷訪問量的博客https://blog.csdn.net/CY19980216/article/details/82825833,當然這個刷訪問量的小爬蟲之前也因爲CSDN自身更新出過一些小問題,不過最近它出了一個很噁心的問題。如下圖所示👇

可能截圖並不是看得那麼清楚,我簡要說明一下問題吧,如果我使用requests方法去刷訪問量,服務器響應的是一串script,沒有博文頁面上的任何節點HTML信息,所以我無法獲取到頁面當前訪問量。

本來我覺得拿不到訪問量也無所謂,只要訪問量確實刷上去就完事了。但事實上現在這樣是無法刷新訪問量的,這就讓我有些困擾了,加上截圖中返回的顯然是一串十六進制的UTF-8編碼,根本看不懂這段JS究竟在說些什麼,所以我決定先把這段JS給“翻譯”成能看得懂的樣子。

我本以爲就bytes一下字符串然後decode就完事了,也犯不着專門記錄這件事情。可能是我太愚鈍,遇到了很奇怪的問題。

問題處理

爲了方便處理我把HTML複製到Notepad++中,注意與上圖的比對,下圖文本中是不會有轉義符的,但是在上圖中無論是反斜槓還是引號都被打上了轉義符。顯然,我並不希望我處理的字符串是上圖中這樣帶有轉義符的樣子,而是下圖中這樣不帶轉義符的樣子(因爲本來下圖中的反斜槓就是轉義符,我不需要再添加轉義符了)。

我以上圖第三行中的第一個'\x63\x73\x4b\x48\x77\x71\x4d\x49'舉個例子:

截圖中Example_1演示的是我希望的結果,即把字符串中自帶的反斜槓視爲轉義符,Example_2是我不希望的結果,即在處理字符串時反斜槓被用轉義符表示爲反斜槓本身了。而我在Real Situation中演示從文本中直接讀取HTML,並用正則匹配十六進制編碼,顯然我找到了對應的十六進制編碼,但我無法去將它們作爲bytes類型處理,如果強行轉化爲bytes會自帶兩個反斜槓,即歸化到Example_2的情況中了。

python讀取文本應該是有以bytes型讀取的方法的,但是這個文本並不是所有的地方都是bytes型,所以不能使用這種方法。

問題解決

總之我最終沒有找到很好的解決方案,於是我使用了最原始的方法,通過搜索引號位置,然後找到所有的編碼,最後用eval()函數直接處理字符串即可:

我們得到了如下的處理後的HTML腳本👇

顯然有部分編碼解碼後是單引號<'>,於是截圖中有大片的灰色字符串部分,簡單轉義處理一下可以有👇

 雖然想辦法“翻譯”了這段JS,但顯然是看不懂的,也不知道怎麼解決這個問題,只能先用selenium先頂着用咯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章