需要掌握:HTTP协议
谷歌浏览器查看请求信息
用谷歌浏览器点击F12,弹出“检查”窗口,然后访问www.sohu.com,如下截图:
上面红框处就是发送请求的消息,参照此消息,使用python socket编程,向www.sohu.com发送请求
注意:
www.sohu.com 是域名,通过dns服务器解析后,得到IP地址,dns解析的过程由底层自动完成,socket编程可以忽略
代码
为了编写高质量代码,可参看 python之http模块client源码分析
向 www.sohu.com 发送请求,代码如下:
import socket
#读取长度
_MAXLINE=1024*64
url='www.sohu.com'
domain='www.sohu.com'
sock=socket.create_connection((domain,80))
fp=sock.makefile("rb")
#拼装请求头
buffs=[b'GET / HTTP/1.1',b'Host: www.sohu.com',b'User-Agent: Python-urllib/3.6',b'Connection: close']
buffs.extend((b"", b""))
msg=b'\r\n'.join(buffs)
#发送请求
sock.sendall(msg)
#读取响应状态
line = fp.readline(_MAXLINE + 1).decode("iso-8859-1")
version, status, reason = line.strip().split(None, 2)
print('响应状态===', version, status, reason)
#读取响应头
headers={}
while True:
line = fp.readline(_MAXLINE + 1)
if line in (b'\r\n', b'\n', b''):
break
key,value=line.decode('iso-8859-1').strip().split(': ')
headers[key]=value
print('打印响应头信息===',headers)
#获取Content-Length
length=int(headers.get('Content-Length'))
print('打印Content-Length===',length)
#读取响应正文
body=bytes()
while length > 0:
data = fp.read(length)
body+=data
length -= len(data)
# print(body.decode('utf-8'))
sock.close()