Python3:Socket模擬HTTTP 請求
阿新 • • 發佈:2018-11-19
大家都知道**requests庫,**既可以做介面測試 ,也可以爬蟲.
它是基於 urllib完成, urllib是基於Socket 完成. 要進行網路請求,資料庫連線等操作
實際用到最底層就是這個 Socket, Socket 是直接和TCP/IP 傳輸協議打交道 .
可想而知 Socket 在程式設計的重要性.
為了證明Socket是最底層,我們來用Socket模擬HTTTP 請求.
我直接拿來程式碼講解吧 ,程式碼我看是沒有問題,怎麼就是執行不了 ,錯誤點在connect.
import socket from urllib.parse import urlparse #解析URL ,不做發起請求 def get_url(url): url=urlparse(url) print(url) host=url.netloc print(host) path=url.path #這段程式碼代表解析URL ,把host 和path 分離出來 if path=="": path="/" #如果為空,把“/”加入進來,這是URL 規範 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host,80)) #做個 socket 連線 client.send("GET{}HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n".format(path,host).encode("utf8")) #模擬傳送請求,我們傳遞了三個引數,呼叫了get 方法 data=b"" #設定為bytes 型別 while True: d=client.recv(1024) if d: data+=d else: break #這段的意思是如果1024 不能容納返回的內容,會一直呼叫recv進行返回直到取值完畢 data=data.decode("utf8") #decode 下是為了能打印出來,這個utf8 是伺服器規定的,存在headers 裡面 print(data) client.close() #關掉我們的連線. get_url("http://www.baidu.com/")