1. 程式人生 > >requests模組入門

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”}

注意:當請求Bodyjson的時候,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保持會話

重定向