urllib.parse模塊
該模塊可以完成對url的編解碼。
先看一段代碼,進行編碼。
此時查看結果,程序顯示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方法
連接 必應 搜索引擎官網,獲取一個搜索的URLhttp://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學習站