requests是一個較為簡單易用的HTTP請求庫,是python中編寫爬蟲程序最基礎(chǔ)常用的一個庫。
而【中文亂碼】問題,是最常遇到的問題,對于初學(xué)者來說,是很困惱的。
本文將詳細(xì)說明,python中使用requests庫編寫爬蟲程序時,出現(xiàn)【中文亂碼】的原因,及常見3種解決辦法。
一、【中文亂碼】情況及出現(xiàn)原因
(一)【中文亂碼】舉例
首先,本文的【中文亂碼】情況,指的是原網(wǎng)頁中的中文內(nèi)容在使用requests獲取后,中文完全無法識別的情況,區(qū)別于\x、\u等編碼情況。如下圖中的例子:
注:requests.get()方法,返回一個response對象,其存儲了服務(wù)器響應(yīng)的內(nèi)容。
(二)出現(xiàn)【中文亂碼】原因
導(dǎo)致上圖中【中文亂碼】的原因:
使用requests庫時,選擇使用的文本響應(yīng)方法不合適,且沒有在代碼中添加設(shè)置合適的編碼,以致于使用【response.text】自動獲取到的網(wǎng)頁編碼,與實際網(wǎng)頁的編碼不一致,進(jìn)而產(chǎn)生【中文亂碼】。
使用requests庫時,可能已經(jīng)形成了一個習(xí)慣,常用【response.text】進(jìn)行文本響應(yīng),而【response.content】常用于圖片、視頻等。
這兩者,最大的一個區(qū)別就是:
1、【response.text】會自動根據(jù)HTTP頭部去推測網(wǎng)頁的編碼,解碼并返回解碼后的文本。
2、【response.content】不會解碼,直接以二進(jìn)制形式返回。
兩種文本響應(yīng)方法,如下表:
方法 | 釋義 |
---|---|
response.text | 服務(wù)器響應(yīng)的內(nèi)容,會自動根據(jù)響應(yīng)頭部的字符編碼進(jìn)行解碼。根據(jù)HTTP頭部對響應(yīng)的編碼做出有根據(jù)的推測,推測文本編碼。返回類型:str;常用于:響應(yīng)文本 |
response.content | 字節(jié)方式的響應(yīng)體,不會根據(jù)HTTP頭部對響應(yīng)的編碼做出有根據(jù)的推測。返回類型:bytes(二進(jìn)制);常用于:圖片、視頻 |
二、3種處理【中文亂碼】的方法
(一)修改網(wǎng)頁文本獲取的方法
據(jù)上,已知原因是獲取文本的方法不對,顯然最簡單、直接的方法就是:
直接將response.text換成response.content
(二)手動指定網(wǎng)頁編碼、再提取文本
據(jù)上,已知使用【response.text】時,會解碼返回,但解碼又與原網(wǎng)頁編碼不一致,而導(dǎo)致【中文亂碼】。
鑒于response也提供了【response.encoding】,來指定返回后的網(wǎng)頁編碼。
所以解決方法可以是:
手動指定網(wǎng)頁編碼,使之得到正常的文本
該方法的較第一種,相對麻煩一點:
首先,需要確認(rèn)原網(wǎng)頁的實際編碼,然后根據(jù)網(wǎng)頁實際編碼做出修改。
具體步驟如下:
1、查看網(wǎng)頁編碼
查看網(wǎng)頁編碼,有以下兩種方式:
(1)直接打開網(wǎng)頁源碼(html)【Ctr+U】,查看編碼:【charset】的值。
(2)使用response的encoding、apparent_encoding,得到網(wǎng)頁編碼。
encoding、apparent_encoding兩者最大的區(qū)別:
encoding是從header中去提取,而apparent_encoding是從網(wǎng)頁源碼去解析,apparent_encoding得到的結(jié)果更準(zhǔn)確。
詳細(xì)如下表:
屬性 | 釋義 |
---|---|
response.encoding | 從網(wǎng)頁響應(yīng)的header中,提取charset字段中的編碼。若header中沒有charset字段,則默認(rèn)為ISO-8859-1編碼模式,ISO-8859-1編碼無法解析中文,這也是中文亂碼的原因。 |
response.apparent_encoding | 從網(wǎng)頁的內(nèi)容中(html源碼)中分析網(wǎng)頁編碼的方式。所以apparent_encoding比encoding更加準(zhǔn)確,獲取到的才是原網(wǎng)頁的實際編碼。 |
以(1)中網(wǎng)址為例,網(wǎng)頁的真實編碼為【GB2312】。
使用encoding、apparent_encoding兩種方法,所得的結(jié)果是不一致的,apparent_encoding才是原網(wǎng)頁實際編碼。如下圖:
2、手動指定文本編碼
根據(jù)上述方法,獲得原網(wǎng)頁的實際編碼后,手動在代碼中指定文本編碼格式,即可解決【中文亂碼】問題。
寫法有2種,可任選其一,如下圖:
(三)在文本獲取后對【中文亂碼】進(jìn)行轉(zhuǎn)碼
除了以上2種解決辦法外,還可以使用pyhton自帶的編碼方法,把【中文亂碼】的內(nèi)容再次進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)換為成網(wǎng)頁實際的編碼格式即可。
轉(zhuǎn)碼方式:encode(‘iso-8859-1’).decode(‘編碼格式’)
如上面例子中,網(wǎng)頁編碼實際為“gb2312”,代碼可修改為:
以上就python使用requests庫編寫爬蟲時,出現(xiàn)【中文亂碼】的原因,及常見的三種處理方法,可供參考。文章來源:http://www.zghlxwxcb.cn/news/detail-659072.html
-end文章來源地址http://www.zghlxwxcb.cn/news/detail-659072.html
到了這里,關(guān)于python中——requests爬蟲【中文亂碼】的3種解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!