<p>可能是Google使用<a href="http://en.wikipedia.org/wiki/HTTP_persistent_connection" rel="nofollow">Keep-Alive</a>来保持套接字打开,以便满足进一步的请求。这需要解析头并读取确切的字节数。</p>
<p>根据您使用的HTTP版本,您必须向头部添加<code>Connection: Keep-Alive</code>或不添加。(这可能是最简单的解决方案:只需使用HTTP/1.0而不是1.1。)</p>
<p>如果仍然使用该功能,则必须接收第一个数据块并</p>
<ol>
<li>如果内部有一个<code>'\r\nContent-Length: '</code>则进行解析,如果有,则获取该字节与下一个<code>'\r\n'</code>之间的字节,并将它们转换为数字。这是你的尺码。</li>
<li>看看你的数据中是否有<code>'\r\n\r\n'</code>。如果是的话,那就是你的头的结尾。从这里开始,您必须读取上面提到的确切字节数。</li>
</ol>
<p>示例:</p>
<pre><code>import socket
s = socket.create_connection(('www.google.com', 80))
s.send("GET / HTTP/1.1\r\n\r\n")
x = s.recv(10000)
poscl = x.lower().find('\r\ncontent-length: ')
poseoh = x.find('\r\n\r\n')
if poscl < poseoh and poscl >= 0 and poseoh >= 0:
# found CL header
poseocl = x.find('\r\n',poscl+17)
cl = int(x[poscl+17:poseocl])
realdata = x[poseoh+4:]
</code></pre>
<p>现在,在<code>cl</code>中有内容长度,在<code>realdata</code>中有有效负载数据(开始)。此请求缺少的字节数为<code>missing = cl - len(realdata)</code>。如果它是<code>0</code>,那么您就得到了所有的东西;如果不是,那么执行<code>s.read(missing)</code>,并重新计算<code>missing</code>,直到它是0。</p>
<p>上面的代码是要完成的工作的简单开始;有些地方可能需要<code>recv()</code>更进一步,然后才能继续。</p>
<p>这是相当顺从的。更简单的方法是</p>
<ol>
<li>要在请求中使用HTTP 1.1的<code>Connection: close</code>头</li>
<li>要使用HTTP 1.0</li>
<li>使用为此任务精心设计的库之一,而不是重新发明轮子。</li>
</ol>