import socketfrom urllib.parse import urlparsefrom selectors import DefaultSelector, EVENT_READ, EVENT_WRITEdef 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请求 ???????????#请求行\r\n请求头\r\n\r\n请求体 ???????????client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".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("\r\n\r\n")[1] ???print(html_data) ???client.close()get_url(‘http://www.baidu.com‘)
响应结果:
响应行\r\n
响应头\r\n
...........\r\n
...........\r\n
...........
\r\n\r\n
响应体
"C:\Program Files\python3.5\python.exe" E:/pythoncode/day07/01.pyHTTP/1.1 200 OKAccept-Ranges: bytesCache-Control: no-cacheContent-Length: 14615Content-Type: text/htmlDate: Thu, 16 Aug 2018 08:52:32 GMTEtag: "5b56b4a8-3917"Last-Modified: Tue, 24 Jul 2018 05:10:00 GMTP3p: CP=" OTI DSP COR IVA OUR IND COM "Pragma: no-cacheServer: BWS/1.1Set-Cookie: BAIDUID=DCD58464E426E409DBF02803181718DB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.comSet-Cookie: BIDUPSID=DCD58464E426E409DBF02803181718DB; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.comSet-Cookie: PSTM=1534409552; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.comVary: Accept-EncodingX-Ua-Compatible: IE=Edge,chrome=1Connection: 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"/>
非阻塞IO发送http请求
原文地址:https://www.cnblogs.com/sunlong88/p/9488322.html