使用socket获取html
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的更多相关文章
- android 通过socket获取IP
如题<android 通过socket获取IP>: socket.getInetAddress().getHostAddress();
- C语言之socket获取网页源码
写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言.但你有没有想过使用C语言来实现呢?我曾经以为用 ...
- JAVA Socket获取服务端信息
1.Socket.getInetAddress(),获取服务端地址. 2.Socket.getPort(),获取服务端端口.
- 通过IP或socket获取对方的MAC地址
1.通过已经连接的socket文件获取: int getpeermac( int sockfd, char *buf ) { int ret =0; struct arpreq arpreq; str ...
- 通过网络socket获取对方 ip 和port
int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述获取socket的对方地址struct sockaddr_in ...
- C++ Socket 获取本机可用端口号(QT)
:加载套接字库,创建套接字(WSAStartup()/socket()): :绑定套接字到一个IP地址和一个端口上(bind()): :将套接字设置为监听模式等待连接请求(listen()): :请求 ...
- php socket获取数据类
<?php define("CONNECTED", true); define("DISCONNECTED", false); /** * Socket ...
- Java之利用Socket获取网站内容
public void main(String[] args){ String host = "123.126.113.42"; int port = 80; Socket s = ...
- socket获取百度页面
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...
随机推荐
- LINQ学习笔记——(2)Lambda表达式
最基本的 Lambda 表达式语法: (参数列表)=>{方法体} 说明: 参数列表中的参数类型可以是明确类型或者是推断类型 如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出 ...
- LINQ学习笔记——(1)添加扩展方法
目的: 对已存在类型的行为进行扩展 注意事项: 扩展方法是一种特殊的静态方法 扩展方法必须在静态类中定义 扩展方法的优先级低于同名的类方法 扩展方法只在特定的命名空间内有效 ...
- Python杂篇
一:文件保存 def save_to_file(file_name, contents): fh = open(file_name, 'w') fh.write(contents) fh.close( ...
- Cache的封装和使用
ICache 接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- [Leetcode] subsets 求数组所有的子集
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...
- 洛谷 P2801 教主的魔法 解题报告
P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...
- display:inline-block带来的问题及解决办法
在日常工作中,会经常遇到两个或多个元素并排排列的效果,以前会使用float等实现,float虽然方便好用,但是需要清除浮动,有时会带来意想不到的bug 而且在移动端是不推荐使用float的,所以使用d ...
- linux bash学习(一)
1.请你以 read 指令的用途,撰写一个 script ,他可以让使用者输入:1. first name 与 2. last name, 最后并且在屏幕上显示:“Your full name is: ...
- Django随笔 01
Django 视图 不处理用户输入,而仅仅决定要展现哪些数据给用户: Django 模板 仅仅决定如何展现Django视图指定的数据. dd http://blog.csdn.net/pipisorr ...
- C++ 中 string, char*, int 类型的相互转换
一.int 1.int 转换成 string 1) to_string函数 —— c++11标准增加了全局函数std::to_string: string to_string (int val); s ...