繁体   English   中英

在 Python 中执行 http 请求的最快方法是什么

[英]What is the fastest way to do http requests in Python

我正在尝试构建一个 Web 应用程序模糊器。 它将从用户那里获取一个词表和一个 url,并将向这些 url 发出请求。 最后,它会根据他们响应的状态代码给出输出。

我写了一些代码,它在本地执行 ~600req/s(完成 4600 行单词表大约需要 8 秒)但是由于我使用的是requests库,我在想是否有更快的方法来做到这一点。

我分析的唯一耗时的部分是 fuzz() 和 req() 函数,因为它们的工作量最大。 我还有其他功能,但我展示的功能必须足以让您理解(我不想放那么多代码)。

def __init__(self):
    self.statusCodes = [200, 204, 301, 302, 307, 403]
    self.session = requests.Session()
    self.headers = {
        'User-Agent': 'x',
        'Connection': 'Closed'
        }

def req(self, URL):
# request to only one url
    try:
        r = self.session.head(URL, allow_redirects=False, headers=self.headers, timeout=3)
        if r.status_code in self.statusCodes:
            if r.status_code == 301:
                self.directories.append(URL)
                self.warning("301", URL)
                return
            self.success(r.status_code, URL)
            return
        return
    except requests.exceptions.ConnectTimeout:
        return
    except requests.exceptions.ConnectionError:
        self.error("Connection error")
        sys.exit(1)

def fuzz(self):
    pool = ThreadPool(self.threads)
    pool.map(self.req, self.URLList)
    pool.close()
    pool.join()
    return

#self.threads is number of threads
#self.URLList is a list of full urls 
'__init__' ((<MWAF.MWAF instance at 0x7f554cd8dcb0>, 'http://localhost', '/usr/share/wordlists/seclists/Discovery/Web-Content/common.txt', 25), {}) 0.00362110137939453125 sec

#each req is around this
'req' ((<MWAF.MWAF instance at 0x7f554cd8dcb0>, 'http://localhost/webedit'), {}) 0.00855112075805664062 sec

'fuzz' ((<MWAF.MWAF instance at 0x7f554cd8dcb0>,), {}) 7.39054012298583984375 sec

Whole Program
[*] 7.39426517487

您可能希望将多个进程与多个线程组合在一起。 由于在执行受 I/O 限制的任务时20 个进程中的 400 个线程的性能优于 4 个进程中的 400 个线程,因此每个进程的线程数是最佳的——越多,它们等待 I/O 的时间百分比越高。

在更高的消失顺序上,您可以尝试重用准备好的请求以节省对象创建时间。 (我不确定这是否会产生影响——例如, requests可能会将它们视为不可变的,因此无论如何它每次都会创建一个新对象。但这可能仍然会缩短输入验证时间或其他东西。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM