爬蟲之Resquests模塊的使用(二)


 

Requests

Requests模塊

Requests模塊是一個用於網絡訪問的模塊,其實類似的模塊有很多,比如urllib,urllib2,httplib,httplib2,他們基本都提供相似的功能。

在上一篇我們已經使用urllib模塊

而Requests會比urllib更加方便,可以節約我們大量的工作,它更加強大,所以更建議使用Requests。

 

 

各種請求方式

requests里提供各種請求方式

HTTP定義了與服務器進行交互的不同方式, 其中, 最基本的方法有四種: GET, POST, PUT, DELETE; 一個URL對應着一個網絡上的資源, 這四種方法就對應着對這個資源的查詢, 修改, 增加, 刪除四個操作.上面的程序用到的requests.get()來讀取指定網頁的信息, 而不會對信息就行修改, 相當於是"只讀". requests庫提供了HTTP所有基本的請求方式, 都是一句話搞定。

requests請求方法

 

請求示例

  r = requests.get(‘https://github.com/timeline.json’)                                # GET請求
  r = requests.post(“http://httpbin.org/post”)                                        # POST請求
  r = requests.put(“http://httpbin.org/put”)                                          # PUT請求
  r = requests.delete(“http://httpbin.org/delete”)                                    # DELETE請求
  r = requests.head(“http://httpbin.org/get”)                                         # HEAD請求
  r = requests.options(“http://httpbin.org/get” )                                     # OPTIONS請求

以上方法均是在此方法的基礎上構建

requests.request(method, url, **kwargs)

返回值屬性

import requests

respone=requests.get('http://www.jianshu.com')
# respone屬性
print(respone.text)# 所請求網頁的內容
print(respone.content) 
print(respone.status_code) #返回狀態碼
print(respone.headers)# 網頁的頭
print(respone.cookies)# 網頁的cookie內容
print(respone.cookies.get_dict())
print(respone.cookies.items())
print(respone.url) # 實際的網址
print(respone.history)
print(respone.encoding) # 所請求網頁的編碼方式

 

 

GET請求:requests.get(url)

import requests

response = requests.get('http://httpbin.org/get') # 返回一個實例,包含了很多的信息
print(response.text)  # 所請求網頁的內容

  

帶參數的GET請求:requests.get(url, param=None)

通常我們會通過httpbin.org/get?key=val方式傳遞。Requests模塊允許使用params關鍵字傳遞參數,以一個字典來傳遞這些參數。

 比如我們想傳遞key1=value1,key2=value2到http://httpbin.org/get里面

構造的url:http://httpbin.org/get?key1=value1&key2=value2

import requests
data = {
    "key1":"key1",
    "key2":"key2"
}
response = requests.get("http://httpbin.org/get",params=data)
print(response.url)

運行結果如下

C:\Pycham\venv\Scripts\python.exe C:/Pycham/demoe3.py
http://httpbin.org/get?key1=key1&key2=key2

Process finished with exit code 0

可以看到,參數之間用&隔開,參數名和參數值之間用=隔開。

上述兩種的結果是相同的,通過params參數傳遞一個字典內容,從而直接構造url。

注意:通過傳參字典的方式的時候,如果字典中的參數為None則不會添加到url上。

 


POST請求:requests.post(url, data=data)

requests.post()用法與requests.get()完全一致,特殊的是requests.post()有一個data參數,用來存放請求體數據

注意:同樣的在發送post請求的時候也可以和發送get請求一樣通過headers參數傳遞一個字典類型的數據

import requests

data = {
    "name":"zhaofan",
    "age":23
}
response = requests.post("http://httpbin.org/post",data=data)
print(response.text)

運行結果如下:

可以看到參數傳成功了,然后服務器返回了我們傳的數據。

C:\Pycham\venv\Scripts\python.exe C:/Pycham/demoe3.py
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "23", 
    "name": "zhaofan"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "19", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.19.1"
  }, 
  "json": null, 
  "origin": "218.200.145.68", 
  "url": "http://httpbin.org/post"
}

 

定制請求頭和cookie信息

import requests
import json

data = {'some': 'data'}
cookie = {'key':'value'}
headers = {'content-type': 'application/json',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers,cookies =cookie)
print(r.text)

 

設置請求超時與代理

import requests
import json
data = {'some': 'data'}
proxies = {'http':'ip1','https':'ip2' }

r = requests.post('https://api.github.com/some/endpoint', data=data,proxies=proxies,timeout = 1) 
print(r.text)

 

傳送json格式數據

有時候我們需要傳送的信息不是表單形式的,需要我們傳JSON格式的數據過去,所以我們可以用 json.dumps() 方法把表單數據序列化

import json
import requests
 
url = 'http://httpbin.org/post'
data = {'some': 'data'}
r = requests.post(url, data=json.dumps(data))
print r.text

運行結果如下:

C:\Pycham\venv\Scripts\python.exe C:/Pycham/demoe3.py
{
  "args": {}, 
  "data": "{\"some\": \"data\"}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "16", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.19.1"
  }, 
  "json": {
    "some": "data"
  }, 
  "origin": "218.200.145.68", 
  "url": "http://httpbin.org/post"
}

  

上傳文件

如果想要上傳文件,那么直接用 file 參數即可

import requests
 
url = 'http://httpbin.org/post'
files = {'file': open('test.txt', 'rb')}
r = requests.post(url, files=files)
print r.text

運行結果如下

{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "Hello World!"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "156", 
    "Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.9.1"
  }, 
  "json": null, 
  "url": "http://httpbin.org/post"
}

  

 

解析json

import requests
import json
response=requests.get('http://httpbin.org/get')

res1=json.loads(response.text) #太麻煩 res2=response.json() #直接獲取json數據 print(res1 == res2) #True

 

 

那r.text和r.content的區別是什么呢? 

 r.text是unicode編碼的響應內容(r.text is the content of the response in unicode)

r.content是字符編碼的響應內容(r.content is the content of the response in bytes)

text屬性會嘗試按照encoding屬性自動將響應的內容進行轉碼后返回,如果encoding為None,requests會按照chardet(這是什么?)猜測正確的編碼

如果你想取文本,可以通過r.text, 如果想取圖片,文件,則可以通過r.content

針對響應內容是二進制文件(如圖片)的場景,content屬性獲取響應的原始內容(以字節為單位)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM