python之socket模拟浏览器发请求 作者:马育民 • 2019-01-08 14:28 • 阅读:10088 需要掌握:[HTTP协议](http://www.malaoshi.top/show_1EFIyjQT04v.html "HTTP协议") ### 谷歌浏览器查看请求信息 用谷歌浏览器点击```F12```,弹出“检查”窗口,然后访问www.sohu.com,如下截图: [](http://www.malaoshi.top/upload/0/0/1EF2ZdjwHyFU.png) 上面红框处就是发送请求的消息,参照此消息,使用python socket编程,向www.sohu.com发送请求 **注意:** >www.sohu.com 是域名,通过dns服务器解析后,得到IP地址,dns解析的过程由底层自动完成,socket编程可以忽略 ### 代码 为了编写高质量代码,可参看 [python之http模块client源码分析](http://www.malaoshi.top/show_1EF2a2QHb72Q.html "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() ``` 原文出处:http://www.malaoshi.top/show_1EF2Zg6SLgnt.html