Request模块基本常识
文章目錄
- Request模塊簡介
- 發送請求:
- r.text
- 定制請求頭:
- 添加請求頭
- Form表單提交數據
- POST傳遞數據
- 響應狀態碼
- 響應頭
- Cookie
- 重定向與請求歷史
- 重定向
- 處理重定向
- 超時
- 錯誤與異常
- 修改headers
- 通過Request的headers參數修改
- 通過request.add_header()方法修改
Request模塊簡介
我們可以在瀏覽器中抓取到這些請求與響應的內容,那么我們可以“偽造”請求嗎?也就是不再通過瀏覽器發送這些數據,而是通過python來模擬瀏覽器發送請求。答案是可行的。而Request模塊就可以完成這種功能。
Requests模塊就是Python實現的簡單易用的HTTP庫
還有其他庫嗎?回答也是肯定的,例如urllib,urllib2,httplib,httplib2等模塊。但是目前來說Requests模塊是最流行的。而且也是做好用的模塊
發送請求:
使用Requests發送網絡請求非常簡單,一開始要導入requests模塊
import requests然后,嘗試獲取某個網頁,在本例中,我們來獲取搜狗網頁首頁:
r=requests.get('https://www.sogou.com/')現在,我們有一個名為r 的Response對象,我們可以從這個對象中獲取我們想要的信息。例如:打印出返回的內容
r.text
實際上,如果我們在瀏覽器上打開這個網址,右鍵選擇“查看網頁源代碼”,你會發現,跟我們剛才打印出來的是一模一樣(如果沒有反爬或者網站是靜態網站)。也就是說,上面幾行代碼已經幫我們把搜狗的首頁的全部源代碼爬了下來。
拼接網址:
1.
注意:字典里的值為None的鍵都不會被添加到URL的查詢字符串中
拓展知識:
你還可以將一個列表傳入:
打印的結果是: http://httpbin.org/get?key1=vavlue1&key2=value2&key2=value3
文本響應內容
我們能讀取服務器響應的內容。在此之前我們使用r.text來訪問服務器返回給我們的內容。并且我們可以看到返回的內容,神奇的是我們竟然沒有做任何關于編碼解碼的事情。其實
requests會自動解碼來自服務器的內容。大多數UNICODE字符集都能被無縫地解碼。
請求發出后,Requests會基于HTTP頭部隊響應的編碼作出有根據的推測。當你訪問r.text之時,requests會使用其推測的文本編碼。你可以找出Requests使用了什么編碼,并且能夠使用e.encoding屬性來改變它:
r.encoding
結果是’utf-8’
如果你改變了編碼,每當你訪問了r.text,Request都將會使用r.encoding的新值
HTML頁面是可以設置編碼信息的,可以查看該編碼信息,然后設置r.encoding為相應的編碼
這樣就能使用正確的編碼解析r.text了。而網頁的編碼可以在瀏覽器中去查看
二進制:
Requests會自動為你解碼gzip和deflate傳輸編碼的響應數據
例如對于圖片信息,可以很方便的保存到文件中。對于圖片,mp3,視頻等數據,往往要使用二進制的方式讀取
import requests
1.r.content是二進制信息
2.open()打開文件對象 with是上下文管理器,它可以幫我們 自動關閉文件
f=open()
f.write()
f.close()
3.as是取一個別名,昵稱
4.wb w是寫入,即使打開一個文件用來寫入數據,b是寫入二進制數據
r是讀取數據
a是追加數據,不覆蓋數據
gbk gb2312
定制請求頭:
建立網站的最終目的是為了讓人來訪問,其實幾乎每個網站都不歡迎爬蟲。甚至現在越來越多的網站發現對方是爬蟲程序的時候就會 直接禁止該爬蟲訪問。也就是不會返回給爬蟲任何信息,有的會返回提示:您當前屬于非法訪問!!
那網站服務器它怎么知道我們是爬蟲呢?判斷方式有很多,其中比較常見的就是通過請求頭來判斷。
在發送HTTP請求的時候瀏覽器都會帶上請求頭信息等,(程序發的時候默認不帶的)如果我們的程序沒有帶上,或者帶上的請求頭信息是錯誤的,也就是不被服務器認可的,那么就會遭到服務器的拒絕。
請求頭的驗證也是最簡單的反爬蟲策略了
添加請求頭
我們的應對方案就是盡可能的模擬瀏覽器的功能或者行為。既然瀏覽器有請求頭的發送,那么我們的程序自然也應該加上。在Requests中我們通過headers參數添加請求頭信息
POST請求主要用來提交表單數據,然后服務器根據表單數據進行分析,再決定返回什么樣的數據給客戶端
Form表單提交數據
在Requests中發生POST請求也是比較容易的操作,要實現這個,只需簡單地傳遞一個字典給data參數,你的數據字典在發出請求時會自動編碼為表單形式:
payload={‘key1’:‘value1’,‘key2’:‘value2’}
r=requests.post{’’,data=payload}
當然Request中的post方法只是相對于get方法多了一個data參數,其他參數都是相似的,例如我們也可以為post中的網址添加查詢字符串params參數,也可以像get方法一樣添加headers參數等。
POST傳遞數據
Content-Type是傳遞數據的類型
1.Content-Type:application/x-www-form-urlencoded(Form形式)表單形式Form
傳遞數據的時候使用data參數,接受一個字典
2.Content-Type:application/json(json格式傳遞數據)
傳遞數據時候采用json參數,接受一個字典
也可以采用data=json.dumps()轉化一下格式(將字典轉換成字符串)
響應狀態碼
響應狀態碼可以很方便的查看我們的響應狀態,我們可以檢測響應狀態碼:
r=requests.get(‘https://httpbin.org/get’)
r.status_code
如果發送了一個錯誤請求(一個4XX 客戶端錯誤,或者5XX 服務器錯誤響應),我們可以通過
response.raise_for_status()來拋出異常:
r=requests.get(‘https://httpbin.org/status/404’)
r.status_code #404
r.raise_for_status() #拋出異常
#異常錯誤
Traceback(most recent call last):
File “requests/models.py”,line 832,in raise_for_status
raise http_errorrequests.exceptions.HTTPError:404 Client Error
如果例子中r 的status_code是200,當我們調用raise_for_status()時,得到的是:
r.raise_for_status() #200
None
查看狀態碼 r.status_code 200 常用來判斷,請求是否成功
響應頭
我們可以查看以一個Python字典形式展示服務器的響應頭
r.headers
#結果是
{‘content-encoding’:‘gzip’,‘transfer-encoding’:‘chunked’,‘connection’:‘close’}
但是這個字典比較特殊?:它是僅為HTTP頭而生的,根據RFC2616(HTTP1.1協議),HTTP頭部是大小寫不敏感的
因此,我們可以使用任意大寫形式來訪問這些響應頭字段:
r.headers[‘Content-Type’]#‘application/json’
r.headers.get(‘Content-Type’)#‘application/json’
響應頭 r.headers 返回響應頭信息 是個字典格式 可以用字典的方式訪問
Cookie
現在的網站中有這樣的一種網站類型,也就是需要用戶注冊以后,并且登陸才能訪問的網站,或者說在不登錄的情況下不能訪問自己的私有數據,例如微博,微信等等
網站記錄用戶信息的方式就是通過客戶端的Cookie值,例如:當我們在瀏覽器中保存賬號和密碼的同時,瀏覽器在我們的電腦上保存了我們的用戶信息,并且在下次訪問這個頁面的時候會自動為我們加載cookie信息
在需要登錄的網站中,瀏覽器將cookie中的信息發送出去,服務器驗證cookie信息,確認登錄。既然瀏覽器在發送請求的時候帶有cookie信息,那么我們的程序同樣也要攜帶cookie信息
cookie是當你訪問某個站點或者特定頁面的時候,留存在電腦里面的一段文本,它用于跟蹤記錄網站訪問者的相關數據信息,比如,搜索偏好,行為點擊,賬號,密碼等內容
通常cookie值信息可以在瀏覽器中復制過來,放在headers中
headers={
‘Accept’:‘application/json,text/javascript,/;q=0.01’,
‘Accept-Encoding’:‘gzip,deflate,br’,
‘Connection’:‘keep-alive’
‘Cookie’:‘xxxxxxxxxxxxxxxxxxxxxx’ #瀏覽器中復制
…………………………
}
這樣就可以隨著請求頭一起發出去了,當然requests也提供了cookies參數,供我們提交cookie信息:
B站訪問案列
import requests url='https://account.bilibili.com/home/userInfo' r=requests.get(url) print(r.json())重定向與請求歷史
重定向
重定向就是通過各種方法將一個網絡請求重新定個方向轉到其它位置。可能原因是有些網址現在已經廢棄不準備再使用等
處理重定向
默認情況下,對于我們常用的GET和POST請求等,Requests會自動處理所有重定向。例如Github把所有的HTTP請求重定向到HTTPS:
r=requests.get('http://github.com') r.url #'https://github.com' r.status_code #200如果你使用的是GET和POST等,那么你可以通過allow_redirects參數禁用重定向處理:
r=requests.get('http://github.com',allow_redirects=Flase) r.status_code #301可以使用響應對象的history方法來追蹤重定向。response.history是一個Response對象的列表,為了完成請求而創建了這些對象,這個對象列表按照從最老到最近的請求進行排序
r=requests.get('http://github.com') r.history #[<Response[301]>]超時
有時候我們由于時間或者對方網站的原因,不想等待很長時間,等待響應的回傳,那么我們就可以加上一個時間超時參數,如果超過我們設定的時間,響應還沒有返回,那么就不再等待。
你可以告訴requests在講過以timeout參數設定的秒數時間之后停止等待響應。建議所有的生產代碼都應該使用這一參數
requests.get((‘http://github.com’,timeout=0.001)
錯誤與異常
遇到網絡問題(如:DNS查詢失敗,拒絕連接等)時,Requests會拋出一個ConnectionError異常
1.如果HTTP請求返回了不成功的狀態碼,Response.raise_for_status()會拋出一個HTTPError異常
2.若請求超時,則拋出一個Timeout異常
3.若請求超過了設定的最大重定的次數,則會拋出一個TooManyRedirects異常
所有Requests顯式拋出的異常繼承自requests.exceptions.RequestException
字符是各種文字和符號的總稱,包括各國家文字,標點符號,圖形符號,數字等。字符集是多個字符的集合
字符集包括:ASCII字符集,GB2313字符集,GB18030字符集,Unicode字符集等
ASCII編碼是1個字節,而Unicode編碼通常是2個字節
User-Agent:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400
XP對應的是Windows NT 5.1
Windows 7對應的是Windows NT 6.1
Windows 8對應的是Windows NT 6.3
GET請求是指從服務器請求獲得數據
User-Agent:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400
修改headers
通過Request的headers參數修改
import requests url='https://www.baidu.com/' heads={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'} e=requests.get(url,headers=heads) print(e.status_code) import json import urllib.request import urllib.parse url='https://www.baidu.com/' heads={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'} e=urllib.request.Request(url,heads)print(e)通過request.add_header()方法修改
import json import urllib.request import urllib.parse url='https://www.baidu.com/' heads={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'} e=urllib.request.Request(url) e.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400') print(e)總結
以上是生活随笔為你收集整理的Request模块基本常识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python正则表达式之编译正则表达式(
- 下一篇: Python通过代理ip访问网站