python庫學習之Requests(二)

weixin_34054866發表於2018-06-20

檔案上傳

import requests

files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)

cookies

import requests

r = requests.get('https://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
    print(key + '=' + value)

session維持會話

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

SSL證照驗證

import requests

response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

直接請求https會得出一個警告

解決方法:

1.忽略這個警告

import requests
from requests.packages import urllib3

urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

2.通過捕獲警告日誌忽略廣告

import logging
import requests
logging.captureWarnings(True)
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

3.通過本地證照

import requests

response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(response.status_code)

代理設定

對於某些網站,在測試的時候請求幾次,能正常獲取內容。但是一旦開始大規模爬取,對於大規模且頻繁的請求,網站可能會直接登入驗證,驗證碼,甚至直接把IP給封禁掉。
那麼為了防止這種情況的發生,我們就需要設定代理來解決這個問題,在 Requests 中需要用到 proxies 這個引數。
可以用這樣的方式設定:

import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('https://www.taobao.com', proxies=proxies)

除了基本的 HTTP 代理,Requests 還支援 SOCKS 協議的代理。

超時設定

import requests

r = requests.get('https://www.taobao.com', timeout=1)
print(r.status_code)

上面的設定 timeout 值將會用作 connect 和 read 二者的 timeout 總和。
如果要分別指定,就可以傳入一個元組:

import requests

r = requests.get('https://www.taobao.com', timeout=(5,10))
print(r.status_code)

如果想永久等待,那麼我們可以直接將 timeout 設定為 None,或者不設定直接留空,因為預設是 None。這樣的話,如果伺服器還在執行,但是響應特別慢,那就慢慢等吧,它永遠不會返回超時錯誤的。

用法如下:

import requests

r = requests.get('https://www.taobao.com', timeout=none)
print(r.status_code)
import requests

r = requests.get('https://www.taobao.com')
print(r.status_code)

身份認證

3027289-90994003bb9fb186.jpg
image
import requests
from requests.auth import HTTPBasicAuth

r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
print(r.status_code)

簡單寫法

import requests

r = requests.get('http://localhost:5000', auth=('username', 'password'))
print(r.status_code)

Prepared Request

from requests import Request, Session

url = 'http://httpbin.org/post'
data = {
    'name': 'germey'
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)

更多高階用法請參考官方文件http://docs.python-requests.org/

相關文章