import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "www.baidu.com"
# 阻塞io,意味着这个时候cpu是空闲的
client.connect((host, 80))
client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format("/", host).encode("utf-8"))

data = b""

while 1:
    recv = client.recv(1024)
    if recv:
        data += recv
    else:
        break

print(str(data, encoding="utf-8"))

  以上方法是同步的,一般我们都会使用requests,requests是基于urllib3,urllib3是基于socket,这都是阻塞的。

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setblocking(False)  # 设置非阻塞socket
host = "www.baidu.com"
# 建立连接之后就不管了,正常情况会出现BlockingIOError。
# 但是我们捕捉异常所以不会出现,而是直接往下走
# 我们往下走了,并不代表连接不建立了,依旧会建立,只是这个过程不耗费cpu,所以去做别的了
try:
    client.connect((host, 80))
except BlockingIOError as e:
    pass

while 1:
    try:
        # 获取数据,连接没建立好,肯定会失败,但是我们捕捉异常,循环等待连接建立好为止
        client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format("/", host).encode("utf-8"))
        break
    except OSError as e:
        pass

data = b""
while 1:
    try:
        recv = client.recv(1024)
    except BlockingIOError as e:
        continue
    if recv:
        data += recv
    else:
        break

print(str(data, encoding="utf-8"))

  虽然很麻烦,但是至少实现了非阻塞

使用socket获取html的更多相关文章

  1. android 通过socket获取IP

    如题<android 通过socket获取IP>: socket.getInetAddress().getHostAddress();

  2. C语言之socket获取网页源码

    写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言.但你有没有想过使用C语言来实现呢?我曾经以为用 ...

  3. JAVA Socket获取服务端信息

    1.Socket.getInetAddress(),获取服务端地址. 2.Socket.getPort(),获取服务端端口.

  4. 通过IP或socket获取对方的MAC地址

    1.通过已经连接的socket文件获取: int getpeermac( int sockfd, char *buf ) { int ret =0; struct arpreq arpreq; str ...

  5. 通过网络socket获取对方 ip 和port

    int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述获取socket的对方地址struct sockaddr_in ...

  6. C++ Socket 获取本机可用端口号(QT)

    :加载套接字库,创建套接字(WSAStartup()/socket()): :绑定套接字到一个IP地址和一个端口上(bind()): :将套接字设置为监听模式等待连接请求(listen()): :请求 ...

  7. php socket获取数据类

    <?php define("CONNECTED", true); define("DISCONNECTED", false); /** * Socket ...

  8. Java之利用Socket获取网站内容

    public void main(String[] args){ String host = "123.126.113.42"; int port = 80; Socket s = ...

  9. socket获取百度页面

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...

随机推荐

  1. Android之ViewPager 第一课

    想要了解Android新版本的的新特性,从头开始吧,这是Android3.0新加入的widget,以前也接触过,但是没有好好的研究过,今天写了一个小程序,研究一下ViewPager. 这个程序是支持左 ...

  2. 前台如何处理后台返回的json数据

    后台返回的json数据格式: { "state": true, "data": { "id": 0, "name": & ...

  3. 【转】GOOGLE-PROTOBUF与FLATBUFFERS数据的序列化和反序列化

    转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unity3d-game/1607.html  关于Protobuf 通过本文的转载和分享的相关链接,足够 ...

  4. 绝对定位后a、button等hover状态样式不显示问题

    <div class="operate"> <el-button>提交项目</el-button> <el-button type=&qu ...

  5. JSP表单提交出现中文乱码的解决方法

    1)post方式 在servlet的doGet( )  doPost( )  中增加以下代码: response.setContentType("text/html;charset=utf- ...

  6. adoop集群动态添加和删除节点

    hadoop集群动态添加和删除节点说明 上篇博客我已经安装了Hadoop集群(hadoop集群的安装步骤和配置),现在写这个博客我将在之前的基础上进行节点的添加的删除. 首先将启动四台机器(一主三从) ...

  7. React & Redux 的一些基本知识点

    一.React.createClass 跟 React.Component 的区别在于后者使用了ES6的语法,用constructor构造器来构造默认的属性和状态. 1. React.createCl ...

  8. 如何加快JavaScript的加载与执行

    JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 浏览器在碰到一个引入外部JS 文件的<script>标签时会停下所有工作 ...

  9. The 13th Zhejiang Provincial Collegiate Programming Contest - C

    Defuse the Bomb Time Limit: 2 Seconds      Memory Limit: 65536 KB The bomb is about to explode! Plea ...

  10. ng父组件调用子组件的方法

    https://www.pocketdigi.com/20170204/1556.html 组件之间方法的调用统一用中间人调用.数据传递直接input和output即可