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模拟发送http请求

原来在这里啊,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连接,发送内容,最后接收响应内容并将其进行输出,关闭连接,是不是很简单呢。运行结果:

socket模拟发送http请求

再来看看通过浏览器查看的百度首页的源码,是不是差不多:


socket模拟发送http请求


之所以出现有些差别是因为浏览器是基于HTTP协议的,而且进行了一些字更深层次的封装。不知道今年这篇文章您看明白没有,如果没有,我哪天再来研究一下。

socket模拟发送http请求 啃饼思录

微信ID:kbthinking

socket模拟发送http请求

1.点击历史信息,查看更多内容

2.按右侧二维码,关注啃饼思录

socket模拟发送http请求

长按二维码关注

THANK YOU

Design by Envse


以上是关于socket模拟发送http请求的主要内容,如果未能解决你的问题,请参考以下文章

Python模拟浏览器实现网页访问

java socket模拟http请求

使用PHP Socket 编程模拟Http post和get请求

C#怎么用Socket模拟 HTTP请求

python socket 模拟http请求

Socket 模拟HTTP客户端请求