使用python的原始模块与网站交互
一.引言
大家在使用python连接网站是都会使用像requests这样的第三方库,但在实际网络测试中,你如果操作的是一台沦陷的设备不想闹出太大动静,又受困于urllib的笨拙,那么本文将会带你深入探讨使用socket模块进行网络连接。
二.思路
步骤序号 | 方法 |
---|---|
1 | 连接网站并发送数据包 |
2 | 循环接受回应 |
三.实现
step(1)–socket连接与数据发送:
使用socket.create_connection()来简化连接过程。
使用ssl.create_default_context()来创建SSL上下文,并使用wrap_socket方法来加密套接字,这样我们便能使用HTTPS协议。
使用sendall确保所有数据都被发送。
path变量是你要添加的具体信息。
import socket
import ssl
path = ''
host = 'www.baidu.com'
port = 443
sending = f'GET /{path} HTTP/1.1\r\nHost: {host}\r\n\r\n'
r = b''
count = 0
context = ssl.create_default_context()
try:
with socket.create_connection((host, port)) as sock:
with context.wrap_socket(sock, server_hostname=host) as ss:
ss.settimeout(2)
ss.sendall(sending.encode())
while True:
try:
pass # 这部分我们接下来会添加
except socket.timeout:
break
except socket.timeout:
pass
except Exception as e:
print(f'\n[!] 错误:{e}')
step(2)–while循环接受与打印:
使用双层try…except以确保所有数据都被发送。
try代码块:
data = ss.recv(4096)
r += data
if not data:
break
count += 1
print('.', end='')
finally代码块:
print(f'\n[*] 共收到{count}个数据包')
message = r.decode()
if message:
print(f'\n[*] 信息:\n{message}')
else:
print('\n[?] 没有信息')
四.总结
简单,太简单。