利用socket與ssl模塊讀取網頁內容


例如:

新浪網站的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM