requests模組入門
安裝
pip install request
引用
import request
支援的python版本(2,3版本都支援)
python2.X 有這些庫名可用: urllib, urllib2, urllib3, httplib, httplib2, requests
python3.X 有這些庫名可用: urllib, urllib3, httplib2, requests
兩者都有的urllib3和requests, 它們不是標準庫.
urllib3 提供執行緒安全連線池和檔案post支援,與urllib及urllib2的關係不大.
requests 自稱HTTP for Humans, 使用更簡潔方便
get請求
引數就url,params,返回的是一個Response類物件(原始碼太長了,自己用ctrl+b看原始碼),這個Response類有很多方法,常用的方法有:status_code,text,content,cookies,encoding,
注意:response.text和 response.context的區別
def get(url, params=None, **kwargs): r"""Sends a GET request. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary, list of tuples or bytes to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response <Response>` object :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) return request('get', url, params=params, **kwargs)
一個完整的get請求,應該包括請求行(url)和請求頭(headers)、請求引數(params)
下面這個例子,沒有定義headers , 可以抓包後,把headers引數值帶上
import requests url='https://www.sogo.com?' para={'query':'tesla'} '''不驗證伺服器的ssl證書,執行會警告D:\Python34\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) ''' r=requests.get(url,params=para, verify=False, allow_redirects=False) #verify=True驗證伺服器的SSL證書,執行沒有警告 #r=requests.get(url,params=para, verify=True, allow_redirects=False) print('狀態碼是',r.status_code) print('text的結果是',r.text) #返回的結果是in unicode,如果你想取文字,可以通過r.text print('content的結果是',r.content)#返回的結果是in bytes,如果想取圖片,則可以通過r.content print('cookie的結果是',r.cookies) print('encoding的結果是',r.encoding)#一般返回的結果是UTF-8 print('raw的結果',r.raw) print('header的結果',r.headers) #以字典物件儲存伺服器響應頭,但是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None
POST請求
如果 body={“name1”:”value1”, “name2”,”value2”}
注意:當請求Body為json的時候,json=body 表示自動將python裡面的字典,轉為json格式引數了
response.json是應答的內容轉成json
如果 body="name1=value1&name2=value2",就不用json格式的必備引數json=body,就必須要用data=body
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
練習:
找個自己公司內部的網站(最後是測試後臺之類的簡單的,無驗證碼的),用指令碼實現登入
COOKIE修改成登陸後的(實現多少天免登陸)
COOKIES的修改
例項化一個物件,然後set值,把這個物件update到get請求對應的cookie裡
coo = requests.cookies.RequestsCookieJar()
coo.set('cookie-name', 'cookie-value', path='/', domain='.xxx.com')
s.cookies.update(c)
怎麼跨請求保持一個cookie
Session物件(會話物件)讓你能夠跨請求保持某些引數,同一個session的所有請求之間保持cookie.同一個主機發送多個請求,底層的TCP連線被重用,從而帶來顯著的效能提升。
# coding:utf-8
import requests
# 先開啟登入首頁,獲取部分cookie
url = "https://passport.cnblogs.com/user/signin"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"
} # get方法加個ser-Agent就可以了
r = requests.get(url, headers=headers,verify=False)
print r.cookies # 新增前的cookies
# 新增登入需要的兩個cookie
coo = requests.cookies.RequestsCookieJar()
coo.set('.CNBlogsCookie', 'xxx') # 填上面抓包內容
coo.set('.Cnblogs.AspNetCore.Cookies','xxx') # 填上面抓包內容
r.cookies.update(c)
print r.cookies # 新增後的cookies
session保持會話
重定向