Python之模拟浏览器向web服务器发送HTTP请求报文(一)

Python之模拟浏览器向web服务器发送HTTP请求报文(一)

序号代表思路顺序

import socket

if __name__ == '__main__':
    # 1.创建tcp客户端套接字   
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.和服务端程序建立连接    提示:网络域名和端口号
    tcp_client_socket.connect(("域名", 端口号))

    # 模拟web浏览器
    # 3.1 请求行  请求方法(GET\POST)+协议版本+\r\n
    request_line = "GET / HTTP/1.1\r\n"
    # 3.2 请求头  提示: 请求头可以根据自己需要自定义一个请求头信息
    # 一.短连接 --> 解决程序收取数据后不断开的第一种方法: 短连接 --> Connection:close\r\n
    # 二.长链接
    request_header = "Host:www.baidu.com\r\nis_login:1\r\nConnection: close\r\n"
    # 3.3 组装http请求报文数据
    request_content = request_line + request_header +"\r\n"
    # 3.4 编码字符串数据
    request_data = request_content.encode("utf-8")
    # 3.发送HTTP请求报文数据
    tcp_client_socket.send(request_data)

    # 4.1 变量 = 空的二进制数据
    result = b""

    while True:
        # 4.接收服务器发送的http响应报文数据
        recv_data = tcp_clinent_socket.recv(1024)
        if recv_data:
            # 4.2 拼接每次接受的数据
            result += recv_data
            # 二、①  Content-Length:100 数据长度(字节)
            # Content-Length:100
            # if len(result) >= 100:
            #     break\

            # 二、②  Transfer-Encoding 判断收到的数据是否有发送接收的标识符(0\r\n)
            if result.rfind(b"0\r\n") !=  -1:
                break
        else:
            break
    print(result)

    # 5.提取响应体数据
    # 5.1分析规律如何获取响应体数据
        # 响应行\r\n
        # 响应体\r\n
        # 空行(\r\n)   
        # 按\r\n\r\n能确定前面的数据是响应行和响应头,后面数据是响应体
        # 响应体
    # 5.2指定分割次数(因为在响应体中也有\r\n\r\n,避免取数据不完整),只分割1次,响应体再有指定数据也不进行分割 maxsplit=1 ---> 分割1次
    request_list = result.split(b"\r\n\r\n", maxsplit=1)
    print(len(request_list))
    # 5.3获取响应体的数据
    response_body_data = request_list[1]
    # 5.4 对二进制数据进行解码
    response_body = response_body_data.decode("utf-8")
    # 5.5 得到二进制响应体数据
    print(response_body)

    # 关闭连接
    tcp_client_socket.close()

小编个人理解所写,如有见解欢迎在下方评论!!!!!!

你可能感兴趣的:(Python)