1. 程式人生 > >請求方式:Get與Post

請求方式:Get與Post

在寫爬蟲的過程中,一定要養成一個好習慣,學會模擬瀏覽器的User-Agent。

如果不去模擬的話,以Python作為User-Agent去訪問,會受到條件的限制。

import requests
#為什麼請求訪問要帶上headers,目的是模擬欺騙瀏覽器,獲取完整的內容 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"
} response=requests.get("http://www.baidu.com",headers=headers)
#status_code,獲取響應碼的值 a=response.status_code #獲取響應報頭 b=response.headers #顯示出訪問的url c=response.url #獲取請求報頭的User-Agent d=response.request.headers #顯示百度原始碼內容,轉換為unicode編碼的形式顯現
e=response.content.decode() print(a) print(b) print(c) print(d) print(e) 輸出結果: a:

200

b:
{'Bdpagetype': '1', 'Bdqid': '0xd1d3ed49000252f7', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+cd213ce012eb7ff371aed51597a8d28c', 'Date': 'Mon, 07 Jan 2019 13:17:46 GMT', 'Expires': 'Mon, 07 Jan 2019 13:17:17 GMT', 'Server': 'BWS/1.1', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com, BDSVRTM=0; path=/, BD_HOME=0; path=/, H_PS_PSSID=1425_21121_28206_28131_26350_28266_28140; path=/; domain=.baidu.com', 'Strict-Transport-Security': 'max-age=172800', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}

c:
https://www.baidu.com/

d:
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'BAIDUID=5F37B2B9D539422C5A3B8738B2D77CAE:FG=1; BIDUPSID=5F37B2B9D539422C5A3B8738B2D77CAE; PSTM=1546867066; BD_LAST_QID=16822138656381887118'}

e:
(百度原始碼,省略)

 

接下來就講一下Get請求方式:

從伺服器獲取資料,最常見的一種請求方式,Get方式用於在url地址中新增一些引數完成訪問。

公式:requests.get(url,headers=?,params=?,**kwargs),其中params是傳遞的引數,以字典的形式。

 

import requests
headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400" }
#請求引數是字典形式,搜尋=wd p={"wd":"莫欺少年窮"} url="https://www.baidu.com/s?" a=requests.get(url,headers=headers,params=p) b=a.request.url print(b) # 輸出結果:'https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7' #結果是url的顯示形態,如果要翻譯,去網上url編碼翻譯,等於號後面的內容等於莫欺少年窮
url_1="https://www.baidu.com/s?wd={}".format("莫欺少年窮") c=requests.get(url_1,headers=headers) d=c.request.url print(d) # 輸出結果是一樣的,這是另外一種傳遞引數的方法。 #format()的作用等同於字串格式化 #例子:莫欺{}少年窮.format(bbb) 輸出結果:莫欺bbb少年窮 輸出結果:

https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7
https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7

 

Post請求方式:

向伺服器傳送資料,POST請求引數在請求體中,訊息長度沒有限制且以隱式的方式進行傳送。

在這兒,我們將百度翻譯小案例來結合起來進行理解。

公式:requests.post(url,data=?,headers=?,json=?,**kwargs),data是需要傳遞進去的引數,同樣是以引數的形式傳遞。

所以看到公式,我們尋找的目標自然是data引數了,get的請求方式是在url上顯示,但post的請求方式卻隱藏在請求中。

 

我們在主體網頁中,並沒有發現有效的data字典引數,所以我們要往下尋找其他基礎板塊。

我們找到了要找的一個目標,在v2transapi中發現了一個有效的DATA字典引數,這個時候我們需要檢查引數的可用性,

確保後續翻譯功能的完美實現,為了驗證唯一性,我將換一句話翻譯:

我們可以發現,sign發生了改變,並非唯一性引數,說明這個data字典引數並不適合。

為了解決這個問題,我們將作業系統從windows電腦切換到ipone X手機,然後繼續尋找data引數:

我們驚喜地發現,這個時候data引數具備了唯一性,是在basetrans檔案裡尋找到的。

所以我們就從這個iponeX作業系統中獲取到需要的引數,完成翻譯功能。

於是有了url地址,data字典,以及必要的json轉換(將json文字轉換為Python文字),程式碼就生成了:

import requests import json
aa=input("請輸入你要翻譯的漢字:") url="https://fanyi.baidu.com/basetrans" headers={"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"} post_data={     "query":aa,      "from":"zh",      "to":"en" } response=requests.post(url,data=post_data,headers=headers) a=response.content.decode()  #將內容轉換成unicode編碼形式 a=json.loads(a)                        #再把內容從json文字轉換為python文字 a=a['trans'][0]['dst']                   #對翻譯結果進行一個數據提煉 print(a)

 

輸出結果(加粗的部分為鍵入的內容):

請輸入你要翻譯的漢字:大家吃晚飯了嗎
Have you had dinner yet?

 

 

 這樣,我們就完成了對百度翻譯的爬蟲,並爬來翻譯功能進行使用。

建議大家多去看看相關的資料,徹底理解一下Get與Post的兩種請求方式。