python socket http加速

时间:2014-04-29 17:16:16

标签: python sockets http

创建小型应用程序网络爬虫:即时编写此代码:

def isGood(URL):
    try:
        cURL = URL + text.patch
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(3)
        sock.connect((URL, 80))
        header  = "GET %s HTTP/1.1\r\n" % text.patch
        header += "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36\r\n"
        header += "Accept: */*\r\n"
        header += "Host: %s\r\n\r\n" % URL
        sock.send(header)
        data = sock.recv(1024)
        html = ""
        for x in range(10):
            html = html + data
            data = sock.recv(1024)
            if len(data) == 0:
                break
        sock.close()
        if str(text.keyword) in html:
            print '+ ' + cURL
            logfile = open(text.output, 'a')
            logfile.write('%s\n' % (cURL))
            logfile.close()
            list_good.append(cURL)
    except:
        pass

代码正常工作,bat si非常慢,连接后需要关闭而socket不关闭等待时间,怎么能加快这个?我在多线程中使用!

1 个答案:

答案 0 :(得分:1)

请不要再尝试编写自己的HTTP堆栈,因为现有的堆栈太慢了。您的代码中只有一些错误:

  • 您执行HTTP / 1.1,这意味着持久连接(例如Connection:keep-alive),除非您另有说明。
  • 这意味着,您需要首先读取HTTP响应标头(您可能不会,可能更快),然后确定内容的长度,例如:检查传输编码块或内容长度(按此顺序)。
  • 如果你不这样做,你就会挂起,直到服务器关闭连接,因为它不想再等待你的下一个请求(keep-alive可以在一个TCP连接上做多个请求)。这就是让你慢下来的原因。
  • 您可以通过执行没有keep-alive的HTTP / 1.0请求来省去所有这些麻烦。但是,每个请求需要一个TCP连接,这会引入大量的开销和延迟,因此可能需要比加载经过验证的HTTP库所需的时间更长,但可以处理正确的HTTP持久连接。即使你是多线程的,也可能需要更长的时间。

所以帮自己一个忙,不要重新发明轮子。 但是如果你仍然愿意自己做,并试图比现有的库更好(这可能是可能的,虽然不是更好)我建议你彻底研究HTTP的规范,例如至少RFC2616。然后让我们看看你是否能够更好更快地做到这一点,因为通常:那些不理解XXX的人会被谴责重新发明它,很糟糕。