urllib.parse子產品
該子產品可以完成對url的編解碼。
先看一段代碼,進行編碼。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iY4MzN3U2N3ITN2QDOhJWO1UmM0MTOzcjZkNGM3ATYj9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
此時檢視結果,程式顯示TypeError錯誤,urlencode函數第一參數要求是一個字典或者二進制組序列。
我們修改代碼:
from urllib import parse
d = {
'id':1
'name': 'tom'
}
url = 'http://www.magedu.com/python'
u = parse.urlencode(d)
print(u)
執行結果:
我們将結果拼接:
url = 'http://www.magedu.com/python?id=1&name=tom'
此時,類似于查詢字元串,相當于get方法
若再次修改:
url = 'http://www.magedu.com/python'
body 'id=1&name=tom'
則此時相當于post請求。
from urllib import parse
d = {
'id':1
'name': 'tom'
'url': 'http://www.magedu.com/python?id=1&name=tom'
}
u = parse.urlencode(d)
print(u)
我們修改name為“張三”:
'name': '張三'
從運作結果來看冒号、斜杠、&、等号、問号等符号全部被編碼了,%之後實際上是單位元組十六進制表示的值。
一般來說url中的位址部分, 一般不需要使用中文路徑, 但是參數部分, 不管GET還是POST方法, 送出的資料中,可能有斜杆、等号、問号等符号,這樣這些字元表示資料,不表示元字元。如果直接發給伺服器端,就會導緻接收方無法判斷誰是元字元, 誰是資料了。為了安全, 一般會将資料部分的字元做url編碼, 這樣就不會有歧義了。後來可以傳送中文, 同樣會做編碼, 一般先按照字元集的encoding要求轉換成位元組序列, 每一個位元組對應的十六進制字元串前加上百分号即可。
網頁使用utf-8編碼:
之前都是進行編碼過程,現在來看一下解碼的過程:
from urllib import parse
d = {
'id':1
'name': 'tom'
'url': 'http://www.magedu.com/python?id=1&name=tom'
}
u = parse.urlencode(d)
print(u)
x = parse.unquote(u)
print(x)
以上就是對parse子產品的介紹,其餘的我們不再進行示範了,下面來了解method方法。
送出方法method
最常用的HTTP互動資料的方法是GET、POST。
GET方法, 資料是通過URL傳遞的, 也就是說資料是在HTTP封包的header部分。POST方法, 資料是放在HTTP封包的body部分送出的。
資料都是鍵值對形式, 多個參數之間使用&符号連接配接。例如a=1&b=abc
GET方法
連接配接 必應 搜尋引擎官網,擷取一個搜尋的URL
http://cn.bing.com/search?q=馬哥教育
需求
請寫程式完成對關鍵字的bing搜尋, 将傳回的結果儲存到一個網頁檔案。
from urllib import parse
base_url = 'http://cn.bing.com/search'
d = {
'q':'馬哥教育'
}
u = parse.urlencode(d)
url = '{}?{}'.format(base_url, u)
print(url)
print(parse.unquote(url))
此時不能送出請求。我們添加代碼:
from urllib.request import urlopen, Request
ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
req = Request(url, headers={
'User-agent':ua
})
with urlopen(req) as res:
with open('o:/bing.html', 'wb+') as f:
f.write(res.read())
f.flush()
程式執行成功。這是對特定頁面的爬取。
POST方法
http://httpbin.org/測試網站
我們來測試一下:
from urllib import parse
from urllib.request import urlopen, Request
import simplejson
url = 'http://httpbin.org/post' # POST
data = parse.urlencode({'name':'張三,@=/&*', 'age':'6' }) # body
ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
req = Request(url, headers={
'User-agent':ua
})
print(data)
with urlopen(req, data=data.encode()) as res: # POST請求,data不能為None
text = res.read()
列印一下d的類型
print(type(d))
通過這種方式就實作了post互動,我們将data送出上去,就是發送post請求,如果對方的網站有響應,會傳回資料,傳回的資料是正好是json,是以對其用simplejson進行轉換。我們是需要根據網站傳回的結果,去選擇合适的方法處理轉換資料。
配套視訊課程,點選這裡檢視
擷取更多資源請訂閱
Python學習站