擅长:python、mysql、java
<p>另一种选择是直接使用<code>socket</code>模块。建立连接,发送HTTP请求,将套接字设置为非阻塞模式,然后使用<code>socket.recv()</code>处理“Resource temporary unavailable”异常读取数据(这意味着没有要读取的内容)。一个非常粗略的例子是:</p>
<pre><code>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)
</code></pre>
<p>但是,<code>urllib.urlopen()</code>有一些好处,如果web服务器重定向,您需要基于URL的基本身份验证等。您可以使用<code>select</code>模块,它将告诉您何时有数据要读取。</p>