例如:
新浪網站的IP地址可以用域名www.sina.com.cn
自動轉換到IP地址,但是怎么知道新浪服務器的端口號呢?
答案是作為服務器,提供什么樣的服務,端口號就必須固定下來。由於我們想要訪問網頁,那就要考慮網頁是http還是https服務:
端口:80 服務:HTTP 說明:用於網頁瀏覽。木馬Executor開放此端口 端口:443 服務:Https 說明:網頁瀏覽端口,能提供加密和通過安全端口傳輸的另一種HTTP。 HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議 它是一個安全通信通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。 HTTPS和HTTP的區別: https協議需要到ca申請證書,一般免費證書很少,需要交費。 http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議 http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443。 http的連接很簡單,是無狀態的 HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比http協議安全
import socket import ssl def sina_html(): sk = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) sk.connect(('www.sina.com.cn',443)) sk.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n') #報頭 buffer = [] #收取網頁數據的列表 while True: ret = sk.recv(10240) #每次收取10240字節 if ret: buffer.append(ret) #每次存放10240字節 else: #收完退出 break sk.close() new_buffer = b''.join(buffer) #把列表轉成字符串 html = new_buffer.split(b'\r\n\r\n',1) #把報頭切出來,得到的是一個列表 print(html[0].decode('utf-8')) #打印報頭 with open('web_sina.html','wb') as f: f.write(html[1]) #把網頁存入文件 if __name__ == '__main__': sina_html()
代碼如上,這樣就得到了一個完整的網頁源碼
需要注意的是兩個點,一個是ssl模塊,一個是端口,由於新浪使用https服務,端口為443,而新浪網在傳輸層進行了加密,ssl模塊可實現加密通信
ssl模塊:此模塊提供對網絡套接字(包括客戶端和服務器端)的傳輸層安全性(通常稱為“安全套接字層”)加密和對等身份驗證工具的訪問。該模塊使用OpenSSL庫。只要在該平台上安裝了OpenSSL,它就可以在所有現代Unix系統,Windows,Mac OS X以及可能的其他平台上使用。
參考:https://docs.python.org/3/library/ssl.html#ssl.SSLContext.wrap_socket