Requests請求方式:Get與Post

爲什麼要學習requests,而不是urllib?

1.requests的底層實現就是urllib。

2.requests在python2和python3中通用,方法完全一樣。

3.requests簡單易用。

4.requests能夠自動幫我們解壓(gzip壓縮等)網頁內容。

 

在寫爬蟲的過程中,一定要養成一個好習慣,學會模擬瀏覽器的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的兩種請求方式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章