利用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
Host: www.sina.com.cn
Connection: close

') #报头
    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'

',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

原文地址:https://www.cnblogs.com/aizhinong/p/11530527.html