例如:
新浪网站的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