另一种选择是socket
直接使用该模块。建立连接,发送 HTTP 请求,将套接字设置为非阻塞模式,然后在socket.recv()
处理“资源暂时不可用”异常的情况下读取数据(这意味着没有什么可读取的)。一个非常粗略的例子是这样的:
import socket, time
BUFSIZE = 1024
s = socket.socket()
s.connect(('localhost', 1234))
s.send('GET /path HTTP/1.0\n\n')
s.setblocking(False)
running = True
while running:
try:
print "Attempting to read from socket..."
while True:
data = s.recv(BUFSIZE)
if len(data) == 0: # remote end closed
print "Remote end closed"
running = False
break
print "Received %d bytes: %r" % (len(data), data)
except socket.error, e:
if e[0] != 11: # Resource temporarily unavailable
print e
raise
# perform other program tasks
print "Sleeping..."
time.sleep(1)
但是,urllib.urlopen()
如果 Web 服务器重定向有一些好处,您需要基于 URL 的基本身份验证等。您可以使用该select
模块,它会告诉您何时有数据要读取。