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协议的,而且进行了一些字更深层次的封装。不知道今年这篇文章您看明白没有,如果没有,我哪天再来研究一下。

原文发布于微信公众号 - 啃饼思录(kbthinking)

原文发表时间:2018-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

libmemcached编译安装报错解决记录

我负责的几个公司内部网站,仅集成了 php 原生 memcache 组件,不支持 memcached 分片存储的自动容灾方案,近期出现过几例因 memcache...

4579
来自专栏金蝶云平台的专栏

Gulp 在金蝶云平台项目中的使用经验

gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript//html/image/css 等文件的的测试、检查、合并、压缩、格式化、...

2690
来自专栏好好学java的技术栈

「文末赠书」http协议简介看这篇就够了

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要...

933
来自专栏HTML5学堂

Gulp 定制专属提速“外挂”(下)

友情提示:推荐阅读时间10分钟 + 练习时间10分钟 上一期给大家分享了Gulp插件的安装与使用,只要掌握了Gulp插件安装的流程与配置,对于其他Gulp插件的...

3098
来自专栏逸鹏说道

用户不在sudoers 文件中。此事将被报告

跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 异常处理汇总-服 务 器 http:/...

3628
来自专栏Django Scrapy

Centos 7下 FTP 服务器

MicrosoftInternetExplorer4 0 2 DocumentNotSpecified 7.8 磅 Normal 0 @font-fac...

8559
来自专栏SDNLAB

“访问限制”&“代理访问”实验

前言: 第三届SDN创新大赛又悄悄临近了,第二届大赛时做的题目积压在电脑里实在可惜,因此简单整理,拿出来和大家分享,从代码到实验过程,比较详尽,可以供初学者参考...

39310
来自专栏cs

vmware14.0知识点手册

本篇文章是VMware官网的 使用VMware Workstation Pro - VMware Workstation Pro 14.0 的开源手册的摘抄版...

7909
来自专栏极客慕白的成长之路

HTTP协议原理及实践

HTTP是在应用层,基于传输层 0x1 低三层 物理层主要作用是定义物理设备如何传输数据 数据链路层在通信的实体间建立数据链路连接 网络层为数据在结...

1273
来自专栏建站达人秀

如何搭建 nginx 静态网站

Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。Nginx不采用每客户机一线程的设计模型,而是...

8974

扫码关注云+社区

领取腾讯云代金券