1. 程式人生 > >Python3:Socket模擬HTTTP 請求

Python3:Socket模擬HTTTP 請求

大家都知道**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/")