python之socket模拟浏览器发请求

需要掌握: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()

原文出处:/show_1EF2Zg6SLgnt.html