HTTP定義了與服務(wù)器交互的不同方法,最基本的方法有4種太防,分別是GET妻顶,POST,PUT蜒车,DELETE讳嘱。URL全稱是資源描述符,我們可以這樣認(rèn)為:一個(gè)URL地址酿愧,它用于描述一個(gè)網(wǎng)絡(luò)上的資源沥潭,而HTTP中的GET,POST嬉挡,PUT钝鸽,DELETE就對應(yīng)著對這個(gè)資源的查,改庞钢,增拔恰,刪4個(gè)操作。其中基括,GET一般用于獲取/查詢資源信息颜懊,而POST一般用于更新資源信息,通常用于我們需要向服務(wù)器提交表單的情況风皿。PUT河爹,DELETE一般比較少見。
如何區(qū)分GET請求與POST請求桐款?表面上咸这,我們可以簡單地通過瀏覽器地址欄是否改變來加以區(qū)分。
比如說鲁僚,我們在百度首頁輸入“挪威的森林”炊苫,回車,然后地址欄會(huì)跳轉(zhuǎn)到搜索結(jié)果的列表頁冰沙。同時(shí)可以看到瀏覽器的地址欄會(huì)發(fā)生改變侨艾,變成’’ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=64075107_1_dg&wd=挪威的森林 …… ’’的形式。變化就在于拓挥,在最初的url后面會(huì)附加相關(guān)的字段唠梨,通常是以‘?’分割url和請求的數(shù)據(jù),各個(gè)數(shù)據(jù)之間用‘&’隔開侥啤。這些數(shù)據(jù)就是你要查詢字段的編碼当叭。而這個(gè)過程茬故,就是典型的GET請求的情況。
與之對應(yīng)的POST請求則顯得“深藏不露”蚁鳖。它在于你必須通過瀏覽器輸入或提交一些服務(wù)器需要的數(shù)據(jù)磺芭,才能給你返回完整的界面,這點(diǎn)其實(shí)與GET請求情況有相通之處醉箕,但是這個(gè)過程瀏覽器的地址欄是不會(huì)發(fā)生跳轉(zhuǎn)的钾腺。
那POST請求提交的數(shù)據(jù)是如何傳給服務(wù)器的呢?大家可以采用一些分析頁面的手段來獲取上傳的數(shù)據(jù)讥裤。實(shí)際上放棒,POST請求是將提交的數(shù)據(jù)放在HTTP包的包體中,這種方式無疑加強(qiáng)了數(shù)據(jù)的安全性己英,不像GET請求那樣间螟,用戶可以通過跳轉(zhuǎn)的url就可以查看出向服務(wù)器發(fā)送的數(shù)據(jù)。另外损肛,POST請求除了提交數(shù)據(jù)外厢破,還可以提交文件,這點(diǎn)也是GET請求做不到的荧关。常見的帳號(hào)密碼登錄過程溉奕,就是典型的POST請求。
為了方便的觀察數(shù)據(jù)交流的情況忍啤,我們除了使用開發(fā)者工具外加勤,還能夠用一些軟件、插件同波。比如大名鼎鼎的Fiddler鳄梅,火狐瀏覽器的插件HTTPFOX,谷歌瀏覽器的插件Fiddler未檩。這里以谷歌插件Fiddler(在谷歌商店下載 https://chrome.google.com/webstore/detail/fiddler/hkknfnifmbannmgkdliadghepbneplka?hl=zh-CN )為例戴尸。
一、GET請求(就以在廈大圖書館中檢索"挪威的森林"為例):
首先我們進(jìn)入廈大圖書館( http://library.xmu.edu.cn/portal/#&panel1-1 ):
打開Fiddler冤狡,在搜索框中輸入“挪威的森林”孙蒙,然后在Fiddler界面中清除(clear)一下,確保顯示的是相關(guān)內(nèi)容悲雳,點(diǎn)擊圖書館頁面的查找:
我們可以看到在Fiddler顯示的就是我們的瀏覽器和服務(wù)端之間進(jìn)行的交流啦挎峦,屬性都是GET。我們點(diǎn)開第一個(gè)看一下合瓢,在Query Url中我們看到一些和字典很像的東西坦胶。
我們再看一下這時(shí)候的url是什么。
可以看到和上面GET的描述一樣,新的url用顿苇?把原來的url和一些傳送的數(shù)據(jù)隔開峭咒,傳送數(shù)據(jù)之間用&表示。這些數(shù)據(jù)和Fidder上的數(shù)據(jù)是一樣的纪岁,也就是說我們可以通過給服務(wù)器傳送這些信息來得到檢索結(jié)果凑队。實(shí)際過程中,沒有必要每個(gè)數(shù)據(jù)都傳送蜂科,我們可以自己先“試試”顽决。
比如把新的url刪成:
看一下能不能出來正確結(jié)果:
好的并不行,那我們再加個(gè)數(shù)據(jù)导匣。
看一下結(jié)果:
這回沒問題了。
我們還可以對這些數(shù)據(jù)進(jìn)行推測茸时,比如pageSize=20贡定,應(yīng)該表示的是每頁顯示20條目錄,sort=score應(yīng)該表示分類或排序的方式可都,這里就不試了缓待。我們知道對q0和sType0進(jìn)行傳送就能達(dá)到我們的目的了。那么渠牲,好戲開始吧旋炒。
(1)使用requests模塊:
import requests
#檢索網(wǎng)址為廈大圖書館
url = 'http://210.34.4.28/opac/search_adv_result.php'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/55.0.2883.103 Safari/537.36', 'Connection':'keep-alive'}
#創(chuàng)建要傳送的關(guān)鍵詞以及檢索類型
params = {'q0':'挪威的森林', 'sType0':'any'}
response = requests.get(url=url, params=params, headers=headers)
response.encoding = 'utf-8'
html = response.text
print(html)
顯示結(jié)果為:
(2)方法二使用urllib模塊
import urllib.request
import urllib.parse
#檢索網(wǎng)址為廈大圖書館
url = 'http://210.34.4.28/opac/search_adv_result.php'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/55.0.2883.103 Safari/537.36', 'Connection':'keep-alive'}
#創(chuàng)建要傳送的關(guān)鍵詞以及檢索類型
values = {'q0':'挪威的森林', 'sType0':'any'}
#編碼工作,將字典轉(zhuǎn)換為字符串的格式
data = urllib.parse.urlencode(value)
#用字符串想加的方式得到新的url
full_url = url + '?' + data
request = urllib.request.Request(url=full_url, headers=headers)
response = urllib.request.urlopen(request).read()
html = response.decode('utf-8')
print(html)
urllib的方法中签杈,新的url還需要用比較麻煩的方式獲得瘫镇,包括調(diào)用了parse中的編碼模塊,手動(dòng)加答姥?實(shí)現(xiàn)字符串拼接铣除。
因此我們能看出requests的便利性。
參考自:
http://www.lining0806.com/2-%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB-get%E8%AF%B7%E6%B1%82%E4%B8%8Epost%E8%AF%B7%E6%B1%82/