socket模拟发送http请求
Posted 啃饼思录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket模拟发送http请求相关的知识,希望对你有一定的参考价值。
socket模拟发送http请求
嗨,小伙伴们,好久不见~~~,最近博主在研究socket编程,觉得socket真的好强大。之前一直我们都是在介绍爬虫的requests、urllib等库,我们知道它们都是基于HTTP协议来实现的,但从来没有讲过这个是如何实现的。今天要是讲的话,一时半会也说不清楚,最重要的是,我怕自己讲不明白。这样大家就变的更糊涂,所以我就不讲了。今天要说的是如何基于socket来发送http请求。
大家都知道,osi有七层模型,但是我们的TCP/IP协议其实并不是完全符合这个模型的。但是有些东西两者都具有的,我们这里简要说一下传输层和应用层。
我们知道这个传输层是TCP和UTP协议,应用层则是我们经常使用的HTTP、SMTP、FTP等协议。应用层的那些协议都是基于传输层协议来的,都是为了实现特定的功能而进行封装的。那么大家就要问了,这个socket是什么,在哪里呢?往下看:
原来在这里啊,Socket它是应用层与传输层(TCP/IP协议族)通信的中间软件抽象层,我们可以认为它是一组接口(api)。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。我们可以利用Socket来模拟HTTP请求,从而实现伪HTTP协议的目的。
我们以get方式来请求百度首页为例,利用Socket来模拟发送HTTP请求。
我们可以直接仿照浏览器的请求头部信息去发送请求,当然也可以通过urllib提供的urlparse方法来对url进行修改,然后通过传递参数的方式来发送信息,相关的代码如下:
# /usr/bin/python
# -*- coding:utf-8 -*-
# @author: Envse
# @file: socket_http.py
# @time: 2018/10/03 16:06
# requests -->urllib -->socket
import socket
from urllib.parse import urlparse
def get_url(url):
# 通过socket请求Url
url = urlparse(url)
host = url.netloc
path = url.path
if path == "":
path = "/"
# 建立socket连接
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, 80))
client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode('utf8'))# 相对路径
data = b""
while True:
d = client.recv(1024)
if d:
data += d
else:
break
data = data.decode('utf8')
html_data = data.split("\r\n\r\n")[1]
print(html_data)
client.close()
if __name__ == '__main__':
get_url("http://www.baidu.com/")
这段代码其实很好理解,就是模拟客户端向服务器发送请求。首先通过get_url方法来将我们需要模拟的url进行处理,然后建立socket连接,发送内容,最后接收响应内容并将其进行输出,关闭连接,是不是很简单呢。运行结果:
再来看看通过浏览器查看的百度首页的源码,是不是差不多:
之所以出现有些差别是因为浏览器是基于HTTP协议的,而且进行了一些字更深层次的封装。不知道今年这篇文章您看明白没有,如果没有,我哪天再来研究一下。
微信ID:kbthinking
1.点击历史信息,查看更多内容
2.按右侧二维码,关注啃饼思录
长按二维码关注
THANK YOU
Design by Envse
以上是关于socket模拟发送http请求的主要内容,如果未能解决你的问题,请参考以下文章