很多小伙伴在剛開(kāi)始學(xué)習(xí)使用爬蟲(chóng)爬取網(wǎng)頁(yè)的時(shí)候都能夠爬取一個(gè)頁(yè)面完整內(nèi)容正確的html界面下來(lái)。小編剛開(kāi)始的時(shí)候也是如此,直到小編某天碰上了自家網(wǎng)站的數(shù)據(jù),才知道自己還是太年輕了。為什么呢?因?yàn)樾【幣赖降捻?yè)面一半是正常的html頁(yè)面和標(biāo)簽,另一半夾雜著奇怪的亂碼。今天我們就來(lái)講解一下爬蟲(chóng)爬到亂碼怎么辦吧!
案例
思路
很多情況出現(xiàn)亂碼的原因其實(shí)還是用戶(開(kāi)發(fā)者)本身造成的。使用了錯(cuò)誤的方式打開(kāi)了一個(gè)文件,就會(huì)出現(xiàn)亂碼。比如說(shuō)文本文件的UTF-8格式的文件被錯(cuò)誤地使用GBK方式打開(kāi)等。而上面的案例中實(shí)際上也是一種錯(cuò)誤的打開(kāi)方式(或者說(shuō),沒(méi)有完全打開(kāi))。實(shí)際上,看到上面的代碼我們第一反應(yīng)是應(yīng)該去查找這是什么代碼。根據(jù)小編的經(jīng)驗(yàn)(沒(méi)有經(jīng)驗(yàn)的也可以百度),這應(yīng)該是URL編碼,然后小編找了站長(zhǎng)工具進(jìn)行測(cè)試后也確定了該編碼方式是URL編碼。
什么是URL編碼?
URL編碼是一種特殊的編碼形式,因?yàn)樽铋_(kāi)始應(yīng)用于URL中所以得名URL編碼。我們知道URL中是不能出現(xiàn)中文還有其他非英文字符的(也可以理解為不能出現(xiàn)非ASCII碼表的字符),但我們又確實(shí)需要在URL中輸入一些非ASCII碼表字符(我們知道,GET方式傳參是將參數(shù)添加到URL后面的,如果不能在URL中輸入非ASCII字符,那么就意味著GET傳參不能實(shí)現(xiàn)其他文字的傳參),于是就出現(xiàn)了URL編碼的標(biāo)準(zhǔn)。URL編碼的方式是把非ASCII碼字符用%和可用的ASCII字符表示出來(lái),這樣就能用這些ASCII字符去表示非ASCII字符了。
小伙伴們會(huì)說(shuō),你看這地址欄不是也出現(xiàn)了中文了嗎?其實(shí)這是瀏覽器的優(yōu)化,為了讓你清楚這個(gè)鏈接,瀏覽器在地址欄會(huì)將URL編碼進(jìn)行解碼,所以你看到的會(huì)是中文
如何解URL編碼
在前端開(kāi)發(fā)中對(duì)于這種數(shù)據(jù)一般是用JavaScript編寫(xiě)一個(gè)解編碼的程序去進(jìn)行解編碼(現(xiàn)在有很多現(xiàn)成的解編碼的js代碼段),小型的數(shù)據(jù)我們可以去站長(zhǎng)工具里面解編碼(這種方式通常用來(lái)驗(yàn)證是否是URL編碼)。但是我們是在爬蟲(chóng)爬取數(shù)據(jù)的時(shí)候需要對(duì)這些URL代碼進(jìn)行解編碼,所以我們要用python的方式去解決。
在python中有一個(gè)自帶的urllib庫(kù),我們知道這個(gè)庫(kù)的request模塊可以進(jìn)行請(qǐng)求,parse模塊可以對(duì)html代碼進(jìn)行解析。實(shí)際上它也可對(duì)URL編碼進(jìn)行解編碼,以下是解編碼的代碼示例,各位小伙伴可以拿去做參考。
import requests
import urllib.parse
url = "http://o2fo.com/article"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'}
data = requests.get(url, headers)
data = data.text
data =urllib.parse.unquote(data)
print(data)
可以看到原本的亂碼變成了一段可閱讀的代碼,說(shuō)明我們解碼成功了。
小結(jié)
以上就是關(guān)于URL編碼和URL編碼解碼的全部?jī)?nèi)容,希望能給各位小伙伴帶來(lái)一絲幫助。也希望各位小伙伴能關(guān)注支持W3Cschool!