python爬蟲中遇到的亂碼問題

一.問題背景

最近因?yàn)樽鰯?shù)據(jù)分析需要用到py去爬取數(shù)據(jù),然后學(xué)習(xí)了py爬蟲的基礎(chǔ)。筆者爬取的是LPL春季賽的戰(zhàn)隊(duì)比賽數(shù)據(jù),然后在這個(gè)過程中遇到了亂碼問題。

二.問題分析

以下是爬取數(shù)據(jù)的部分代碼

url = 'https://lpl.qq.com/es/data/rank.shtml?iGameId=134&sGameType=1,5'
res = requests.get(url,params=params,headers=headers)

獲得res后筆者就順手打印了一下res.text(),結(jié)果是正常打印如下:


image.png

發(fā)現(xiàn)有亂碼產(chǎn)生,然后筆者看到網(wǎng)頁的charset='gbk',于是就想著直接encode('gbk'),但是卻發(fā)現(xiàn)還是不對(duì)。

r = res.text.encode('gbk')
print(r)

結(jié)果報(bào)錯(cuò)如下:

image.png

然后筆者將錯(cuò)誤復(fù)制到度娘查詢一番之后,才了解str轉(zhuǎn)bytes叫encode,bytes轉(zhuǎn)str叫decode。所以要把res.text轉(zhuǎn)編碼就得先轉(zhuǎn)成bytes然后再解碼才行。

于是,筆者開始嘗試。在嘗試以上方法之前,筆者先打印了一下res.text的encoding

print(res.encoding)
#結(jié)果如下
D:\IT\untitled\venv\Scripts\python.exe D:/IT/untitled/lpl_spider.py
ISO-8859-1

Process finished with exit code 0

很明顯,res的編碼是ISO-8859-1,所以筆者下面的嘗試就有頭緒了,先將res.text用ISO-8859-1轉(zhuǎn)換成bytes,然后將轉(zhuǎn)好的bytes用網(wǎng)頁的charset 也就是gbk解碼即可。
具體代碼如下:

r = res.text.encode('ISO-8859-1').decode('gbk')
print(r)

下圖可以發(fā)現(xiàn),中文亂碼問題解決了。


image.png

三.收獲總結(jié)

python3里面,字符串要先encode手動(dòng)指定其為某一編碼的字節(jié)碼之后,才能decode解碼。

爬蟲編碼亂碼解決思路:

  • 1.首先encoding一下response.text查看初始編碼A
  • 2.將response.text用encode('A')轉(zhuǎn)為bytes
  • 3.將轉(zhuǎn)換完的代碼繼續(xù)用decode解碼,解碼用的編碼是爬取的網(wǎng)頁上的編碼。即charset。
    代碼:
response.text.encode('A').decode('爬取網(wǎng)頁的charset')

四.參考網(wǎng)址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容