9.Python爬蟲利器一之Requests庫的用法(一)

requests 官方文檔:html

http://cn.python-requests.org/zh_CN/latest/user/quickstart.htmlpython

request 是一個第三方的HTTP庫json

 

1.發起請求瀏覽器

發起GET請求很是簡單,直接使用requests的get方法便可。比方說下面的代碼獲取百度首頁的信息。服務器

1 import requests
2 
3 baidu_url = 'https://www.baidu.com'
4 
5 response = requests.get(baidu_url)
6 print(response.content.decode())
若是要在URL上附加參數,也很是簡單,使用params參數傳入字典便可。參數會自動附加到URL上,列表參數也會正確的附加。這裏這個網站是一個HTTP調試網站,值得收藏。若是咱們訪問這個網站,它會將瀏覽器發送的請求頭,用戶代理、表單參數等信息以格式化JSON形式返回,對HTTP調試很是有幫助。
1 #基本Get請求
2 r = requests.get('http://httpbin.org/get')
3 #若是要加參數,能夠利用params參數
4 payload = {'key1':'values','key2':'valus'}
5 r = requests.get('http://httpbin.org/get',params=payload)
6 print r.url

其餘經常使用的HTTP操做例如PUT、DELETE、HEAD、OPTIONS等也支持,調用相應方法便可。cookie

獲取結果

發起請求以後,返回值是一個Response對象,利用它咱們能夠方便的獲取結果。數據結構

響應對象的經常使用屬性和方法以下。app

屬性名 結果
text HTTP字符
encoding 響應編碼,這個值能夠改變,改變以後text屬性也會根據編碼而變化
content 未編碼的二進制數據
json() 返回JSON數據
raw 結果的原始字節流
url 請求的URL
status_code 狀態碼
headers 請求頭字典
cookies cookies字典
history 若是發生重定向,全部請求對象都會保存到這裏
r.status_code #響應狀態碼
r.raw #返回原始響應體,也就是 urllib 的 response 對象,使用 r.raw.read() 讀取
r.content #字節方式的響應體,會自動爲你解碼 gzip 和 deflate 壓縮
r.text #字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼
r.headers #以字典對象存儲服務器響應頭,可是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None
#*特殊方法*#
r.json() #Requests中內置的JSON解碼器
r.raise_for_status() #失敗請求(非200響應)拋出異常

自定義header

若是要在請求上添加請求頭,也很是簡單。有些網站對客戶端的限制比較嚴格,因此咱們必須假裝header。post

1 #若是想添加headers 能夠傳入headers參數
2 headers = {'content-type':'application/jason'}
3 r = requests.get('http://httpbin.org/get',headers = headers)
4 print r.url

假如使用自帶的urllib標準庫,那麼代碼就比較複雜了。從這裏咱們能夠看到requests確實很是方便。網站

headers = {'content-type':'application/jason'}
r = urllib2.request(url,headers = headers)
response = urllib2.urlopen(r)
print response.read().decode()

 

POST數據

若是咱們要發送複雜的表單,就須要POST數據了。和GET傳送數據同樣,想方法中額外添加一個data參數的事兒。這種方式至關於你在表單中填寫這些數據,而後點擊表單的提交。

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=data)
print(response.text)

 

有時候POST數據不是使用表單方式,而是直接在請求體中附加參數。那麼咱們在發送參數的時候不能向data參數添加字典了,而應該傳遞字符串。

import json

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=json.dumps(data))
print(response.text)

備註: json的幾個經常使用方法 json.load(), json.dump() ,json.loads(), json.dumps()

json.loads() : 將json結構轉變成Python數據結構

json.dumps():將Python數據結構轉變成json結構

json.load(): 讀取json文件轉成Python數據結構

json.dumps():寫入jason文件

 

參考自: https://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

有些程序(例如Github的API)須要將JSON字符串直接當作請求體發送,好比說上面這種將字典轉換爲JSON的例子。在這種狀況下,咱們能夠直接將字典的引用傳遞給方法的json參數,這樣就不須要咱們手動轉換,requests會自動轉換。

response = requests.post(f'{base_url}post', json=data)

上傳文件

在網頁上,上傳頭像等操做都須要上傳multipart/form-data類型的表單。使用requests也很是簡單。須要注意打開文件的時候最好使用二進制模式,使用文本模式打開文件可能致使requests不能正確計算文件的大小。

file = open(r'c:\Windows\System32\drivers\etc\hosts', mode='rb')

data = {
    'file': file
}

response = requests.post(f'{base_url}post', files=data)
print(response.text)
#requests 支持流失上傳的,容許發送大的數據流或文件而無需先把他讀入內存。需使用流式上傳
with open('massive-body') as f:
    requests.post('http://some.url/streamed',data=f)

cookies

若是要獲取響應的cookies,調用cookies屬性便可,它會返回一個RequestsCookieJar對象,它實現了標準庫的http.cookiejar。因此咱們能夠按照cookiejar的方法來使用RequestsCookieJar。好比說訪問百度的時候,它會分配一個cookie,因此咱們可使用下面的代碼獲取Cookie。

response = requests.get(baidu_url)
print(response.cookies)

若是要在發送數據的時候向服務器傳遞cookie,須要實例化一個RequestsCookieJar,而後傳遞給發送方法的cookies參數。

import requests.cookies

cookies = requests.cookies.RequestsCookieJar()
cookies.set('name', 'yitian')
response = requests.get(f'{base_url}cookies', cookies=cookies)
print(response.text)

 

以上就是requests的快速入門。具體的高級應用能夠參考官方文檔。

相關文章
相關標籤/搜索