![](/img/trans.png)
[英]What is the fastest way to send 100,000 HTTP requests in Python?
[英]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.