當 URL 路徑或者查詢參數(shù)中,帶有中文或者特殊字符的時候,就需要對 URL 進行編碼(采用十六進制編碼格式)。URL 編碼的原則是使用安全字符去表示那些不安全的字符。
安全字符,指的是沒有特殊用途或者特殊意義的字符。
URL基本組成
URL 是由一些簡單的組件構成,比如協(xié)議、域名、端口號、路徑和查詢字符串等,示例如下:
http://www.biancheng.net/index?param=10
路徑和查詢字符串之間使用問號?
隔開。上述示例的域名為 www.biancheng.net,路徑為 index,查詢字符串為 param=1。
URL 中規(guī)定了一些具有特殊意義的字符,常被用來分隔兩個不同的 URL 組件,這些字符被稱為保留字符。例如:
- 冒號:用于分隔協(xié)議和主機組件,斜杠用于分隔主機和路徑
-
?
:用于分隔路徑和查詢參數(shù)等。 -
=
用于表示查詢參數(shù)中的鍵值對。 -
&
符號用于分隔查詢多個鍵值對。
其余常用的保留字符有:/ . ... # @ $ + ; %
哪些字符需要編碼
URL 之所以需要編碼,是因為 URL 中的某些字符會引起歧義,比如 URL 查詢參數(shù)中包含了”&”或者”%”就會造成服務器解析錯誤;再比如,URL 的編碼格式采用的是 ASCII 碼而非 Unicode 格式,這表明 URL 中不允許包含任何非 ASCII 字符(比如中文),否則就會造成 URL 解析錯誤。
URL 編碼協(xié)議規(guī)定(RFC3986 協(xié)議):URL 中只允許使用 ASCII 字符集可以顯示的字符,比如英文字母、數(shù)字、和- _ . ~ ! *
這 6 個特殊字符。當在 URL 中使用不屬于 ASCII 字符集的字符時,就要使用特殊的符號對該字符進行編碼,比如空格需要用%20
來表示。
除了無法顯示的字符需要編碼外,還需要對 URL 中的部分保留字符和不安全字符進行編碼。下面列舉了部分不安全字符:
[ ] < > " " { } | \ ^ * · ‘ ’ 等
下面示例,查詢字符串中包含一些特殊字符,這些特殊字符不需要編碼:
http://www.biancheng.net/index?param=10!*¶m1=20!-~_
下表對 URL 中部分保留字符和不安全字符進行了說明:
字符 | 含義 | 十六進制值編碼 |
---|---|---|
+ | URL 中 + 號表示空格 | %2B |
空格 | URL中的空格可以編碼為 + 號或者 %20 | %20 |
/ | 分隔目錄和子目錄 | %2F |
? | 分隔實際的 URL 和參數(shù) | %3F |
% | 指定特殊字符 | %25 |
# | 表示書簽 | %23 |
& | URL 中指定的參數(shù)間的分隔符 | %26 |
= | URL 中指定參數(shù)的值 | %3D |
下面簡單總結(jié)一下,哪些字符需要編碼,分為以下三種情況:
- ASCII 表中沒有對應的可顯示字符,例如,漢字。
- 不安全字符,包括:# ”% <> [] {} | \ ^ `?。
- 部分保留字符,即 & / : ; = ? @ 。
Python實現(xiàn)編碼與解碼
Python 的標準庫urllib.parse
模塊中提供了用來編碼和解碼的方法,分別是 urlencode() 與 unquote() 方法。
方法 | 說明 |
---|---|
urlencode() | 該方法實現(xiàn)了對 url 地址的編碼操作 |
unquote()? | 該方法將編碼后的 url 地址進行還原,被稱為解碼 |
1) 編碼urlencode()
下面以百度搜索為例進行講解。首先打開百度首頁,在搜索框中輸入“爬蟲”,然后點擊“百度一下”。當搜索結(jié)果顯示后,此時地址欄的 URL 信息,如下所示:
https://www.baidu.com/s?wd=爬蟲&rsv_spt=1&rsv_iqid=0xa3ca348c0001a2ab&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=ib&rsv_sug3=8&rsv_sug1=7&rsv_sug7=101
可以看出 URL 中有很多的查詢字符串,而第一個查詢字符串就是“wd=爬蟲”,其中 wd 表示查詢字符串的鍵,而“爬蟲”則代表您輸入的值。
在網(wǎng)頁地址欄中刪除多余的查詢字符串,最后顯示的 URL 如下所示:
https://www.baidu.com/s?wd=爬蟲
使用搜索修改后的 URL 進行搜索,依然會得到相同頁面。因此可知“wd”參數(shù)是百度搜索的關鍵查詢參數(shù)。下面編寫爬蟲程序?qū)?“wd=爬蟲”進行編碼,如下所示:
#導入parse模塊
from urllib import parse
#構建查詢字符串字典
query_string = {
'wd' : '爬蟲'
}
#調(diào)用parse模塊的urlencode()進行編碼
result = parse.urlencode(query_string)
#使用format函數(shù)格式化字符串,拼接url地址
url = 'http://www.baidu.com/s?{}'.format(result)
print(url)
輸出結(jié)果,如下所示:
wd=%E7%88%AC%E8%99%AB
http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB
編碼后的 URL 地址依然可以通過地網(wǎng)頁址欄實現(xiàn)搜索功能。
除了使用 urlencode() 方法之外,也可以使用 quote(string) 方法實現(xiàn)編碼,代碼如下:
from urllib import parse
#注意url的書寫格式,和 urlencode存在不同
url = 'http://www.baidu.com/s?wd={}'
word = input('請輸入要搜索的內(nèi)容:')
#quote()只能對字符串進行編碼
query_string = parse.quote(word)
print(url.format(query_string))
輸出結(jié)果如下:
輸入:請輸入要搜索的內(nèi)容:編程幫www.biancheng.net
輸出:http://www.baidu.com/s?wd=%E7%BC%96%E7%A8%8B%E5%B8%AEwww.biancheng.net
注意:quote() 只能對字符串編碼,而 urlencode() 可以直接對查詢字符串字典進行編碼。因此在定義 URL 時,需要注意兩者之間的差異。方法如下:
# urllib.parse
urllib.parse.urlencode({'key':'value'}) #字典
urllib.parse.quote(string) #字符串
2) 解碼unquote(string)
解碼是對編碼后的 URL 進行還原的一種操作,示例代碼如下:
from urllib import parse
string = '%E7%88%AC%E8%99%AB'
result = parse.unquote(string)
print(result)
輸出結(jié)果:
爬蟲
3) URL地址拼接方式
最后,給大家介紹三種拼接 URL 地址的方法。除了使用 format() 函數(shù)外,還可以使用字符串相加,以及字符串占位符,總結(jié)如下:文章來源:http://www.zghlxwxcb.cn/news/detail-822188.html
# 1、字符串相加
baseurl = 'http://www.baidu.com/s?'
params='wd=%E7%88%AC%E8%99%AB'
url = baseurl + params
# 2、字符串格式化(占位符)
params='wd=%E7%88%AC%E8%99%AB'
url = 'http://www.baidu.com/s?%s'% params
# 3、format()方法
url = 'http://www.baidu.com/s?{}'
params='wd=%E7%88%AC%E8%99%AB'
url = url.format(params)
python教程,8天python從入門到精通,學python看這套就夠了文章來源地址http://www.zghlxwxcb.cn/news/detail-822188.html
到了這里,關于Python爬蟲——URL編碼/解碼詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!