• 非阻塞IO发送http请求


    import socket
    from urllib.parse import urlparse
    from selectors import DefaultSelector, EVENT_READ, EVENT_WRITE
    def get_url(url):
        #通过socket请求html
        url = urlparse(url)
        host = url.netloc
        path = url.path
        if path == "":
            path = "/"
    
        #建立socket连接
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.setblocking(False)
        try:
            #如果不try的话 则会有异常,因为链接还没建立好
            #BlockingIOError: [WinError 10035] 无法立即完成一个非阻止性套接字操作。
            client.connect((host, 80)) #阻塞不会消耗cpu
        except BlockingIOError as e:
            pass
    
        #不停的询问连接是否建立好, 需要while循环不停的去检查状态
        #做计算任务或者再次发起其他的连接请求
    
        while True:
            try:
                #发送http请求
                #请求行
    请求头
    
    请求体
                client.send("GET {} HTTP/1.1
    Host:{}
    Connection:close
    
    ".format(path, host).encode("utf8"))
                break
            except OSError as e:
                pass
    
    
        data = b""
        while True:
            try:
                d = client.recv(1024)
            except BlockingIOError as e:
                continue
            if d:
                data += d
            else:
                break
    
        data = data.decode("utf8")
        html_data = data.split("
    
    ")[1]
        print(html_data)
        client.close()
    
    
    get_url('http://www.baidu.com')

     响应结果:

    响应行

    响应头

    ...........

    ...........

    ...........

    响应体

    "C:Program Filespython3.5python.exe" E:/pythoncode/day07/01.py
    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Cache-Control: no-cache
    Content-Length: 14615
    Content-Type: text/html
    Date: Thu, 16 Aug 2018 08:52:32 GMT
    Etag: "5b56b4a8-3917"
    Last-Modified: Tue, 24 Jul 2018 05:10:00 GMT
    P3p: CP=" OTI DSP COR IVA OUR IND COM "
    Pragma: no-cache
    Server: BWS/1.1
    Set-Cookie: BAIDUID=DCD58464E426E409DBF02803181718DB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BIDUPSID=DCD58464E426E409DBF02803181718DB; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: PSTM=1534409552; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Vary: Accept-Encoding
    X-Ua-Compatible: IE=Edge,chrome=1
    Connection: close
    
    <!DOCTYPE html><!--STATUS OK-->
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html;charset=utf-8">
    	<meta http-equiv="X-UA-Compatible" content="IE=Edge">
    	<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
    	<link rel="dns-prefetch" href="//t1.baidu.com"/>
    	<link rel="dns-prefetch" href="//t2.baidu.com"/>
    	<link rel="dns-prefetch" href="//t3.baidu.com"/>
    	<link rel="dns-prefetch" href="//t10.baidu.com"/>
    	<link rel="dns-prefetch" href="//t11.baidu.com"/>
    	<link rel="dns-prefetch" href="//t12.baidu.com"/>
    	<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
    

      

  • 相关阅读:
    Redis中两种持久化机制RDB和AOF
    Redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    正则匹配日期
    Linux笔记oom时anon rss和total vm的含义
    go笔记time ticker泄露的排查
    C++笔记编译优化:RVO、NRVO
    C++笔记成员变量的初始值
    Redis Java客户端Jedis入门
    vs2005下安装windows sdk v7.1 出现:uuid.lib(unknwn_i.obj) : fatal error LNK1103 或uuid.lib(oaidl_i.obj) : fatal error LNK1103
    查看Nginx的状态
  • 原文地址:https://www.cnblogs.com/sunlong88/p/9488322.html
Copyright © 2020-2023  润新知