1. 程式人生 > 實用技巧 >Python之request和socket介紹

Python之request和socket介紹

一、requests庫基本使用

請求方式:

​ get,post,head,put,delete,options。

**kwargs訪問控制引數:

  • params:字典或位元組序列,作為引數加到URL中
  • data:字典、位元組序列或檔案物件,作為request的內容
  • json:json格式的資料,作為request的內容
  • headers:字典,http定製頭
  • cookies:字典或cookiejar
  • files:字典型別,傳輸檔案
  • timeout:設定超時時間,秒為單位、
  • proxies:字典型別,設定訪問代理伺服器,可以增加登陸認證
  • allow_redirects:true/false,預設true,重定向開關
  • stream:true/false,預設true,獲取內容立即下載開關
  • verify:true/false,預設true,認證SSL證書開關
  • cert:本地SSL證書
  • auth:元組,支援http認證功能

使用requests方法後,會返回一個response物件。

response物件的屬性:

r.status_code:http請求的返回狀態

r.text:http響應內容的字串形式

r.encoding:從http header中猜測的響應內容編碼方式

r.apparent_encodign:從內容中分析出的響應內容編碼格式

r.content:http響應內容的二進位制形式

requests庫的異常:

requests.ConnectionError:網路連線錯誤異常,如DNS查詢失敗、拒絕連線等

requests.HTTPErroe:http錯誤異常

requests.URLRequired:URL缺失異常

requests.TooManyRedirects:超過最大重定向次數,產生重定向異常

requests.ConnectTimeout:連線遠端伺服器超時異常

requests.Timeyout請求URL是,產生超時異常

requests.raise_for_status():如果不是200,產生requests.HTTPError

1.request.get(url,params=*,**kwargs)

其中後兩個引數可選

import requests
response = requests.get('http://xxxx.xx')

response = requests.get('http://xxxx.xx/?a=xxx&b=sss')

data = {'a'='xxx','b'='sss'}
response = requests.get('http://xxxx.xx',params=data)

payload = {'key1': 'value1', 'key2': 'value2'}
headers = {'content-type': 'application/json'}
response = requests.get("http://xxx.xx", params=payload, headers=headers)

#response的一些屬性:

r = requests.get("https://www.baidu.com")
print r.status_code
#print r.text
print r.encoding
print r.apparent_encoding
#print r.content
#print r.json()
print r.reason
print r.headers
print r.cookies
print r.raw

2.requests.post(url,data=None,json=None,**kwargs)

import requests
data={'a'='xxx','b'='sss'}
response = requests.post('http://xxx.xx',data=data)

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

3.request.head(url,**kwargs)

4.requests.put(url,data=None,**kwargs)

5.request.patch(url,data=None,**kwargs)

6.request.delete(url,**kwargs)

以上都大同小異,就不寫了。。。

二、socket庫

  • sk.socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

    引數一:

    ​ 預設為socket.AF_INET(IPv4),還有socket.AF_INET6(IPv6),socket.AF_UNIX,其中最後一個只能用於單一的UNIX系統程序間通訊

    引數二:型別

    ​ socket.SOCK_STREAM //流式socket,tcp(預設)

    ​ socket.SOCK_DREAM //資料報式socket,udp

    引數三:協議

    ​ (預設)與特定的地址家族相關的協議,如果是 0 ,則系統就會根據地址格式和套接類別,自動選擇一個合適的協議(非必填)

    #建立socket:
        #TCP socket
        sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        # UDP socke
        sk = socket.socket(socket.AF_INET,socket.SOCK_DREAM)
    

1.socket常用函式介紹

因為TCP傳送資料時已經建立好連結,所以不需要指定地,UDP是面向無連結的,每次傳送需要指定。
  • 伺服器端函式:

    函式名 描述
    sk.bind(address) 將套接字繫結到地址,address是元組(host,port)
    sk.listen(backlog) 開始監聽TCP傳入連結,backlog指定在拒絕連線前,作業系統可以連線的最大連線數,最少為1
    sk.accept() 接收TCP連線並返回(conn,address),其中conn是新的套接字物件
  • 客戶端函式:

    函式名 描述
    sk.connect(address) 連線到address處的套接字,address是元組(host,port),如果連接出錯,返回socket.error
    sk.connect_ex(address) 功能與上相同,但成功返回0,失敗返回erron的值
  • 公共函式:

    函式 描述
    sk.recv(bufsize[,flag]) 接收TCP套接字的資料,資料已字串形式返回,bufsize指定接收最大資料量,flag提供有關訊息的其他資訊,可省略
    sk.send(string[,flag]) 傳送TCP資料,返回值是要傳送的位元組數量
    sk.sendall(string[,flag]) 傳送完整TCP資料,在返回之前嘗試傳送所有資料,成功返回none,失敗跑出異常
    sk.recvfro(bufsize[,flag]) 接收UDP套接字資料,返回值是(data,address)。data是包含接收資料的字串,address是傳送資料的套接字地址
    sk.sendto(string[,flag],address) 傳送UDP資料,address是元組(host,port),返回值是傳送的位元組數
    sk.close() 關閉套接字
    sk.getpeername() 返回套接字的遠端地址,返回值是(host,port)
    sk.getsockname() 返回套接字自己的地址

2.舉例:

#伺服器端
import socket
host = '192.168.1.123'
port = 4444
sk = socket.socket(socket.AF_INET,socket_STREAM)
sk.bind((host,port))
sk.listen(5)
print 'Conn...'
while True:
    print 'conn ok'
    conn,addr = accept()
    print 'conne form ',addr
    while True:
        data = sk.soket.recv(1024)
        print data
        print 'server received your msg'
sk.close()

#客戶端
import socket
host = '192.168.1.123'
port = 4444
sk = socket.socket(socket.AF_INET,socket,STREAM)
sk.connet((host,port))
while True:
    msg = input('input msg:')
    sk.send(msg)
    data = sk.recv(1024)
    print data
sk.close()

檢視socket狀態: netstart -an

request和socket大致介紹就這樣了,不是很全,但基本用法都在這了