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

2024-10-01 00:35:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一个web应用程序fuzzer。它将从用户那里获取一个单词列表和一个url,并对这些url执行请求。最后,根据响应的状态码给出输出。你知道吗

我已经写了一些代码,它在本地执行~600req/s(完成4600行wordlist大约需要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

Tags: 函数selfurlreturndefstatuscoderequests
1条回答
网友
1楼 · 发布于 2024-10-01 00:35:31

您可能希望将多个进程与多个线程结合起来。正如400 threads in 20 processes outperform 400 threads in 4 processes while performing an I/O-bound task所示,每个进程有一个最佳线程数,它们等待I/O的时间百分比越高

在较高的消失阶上,可以尝试重用prepared requests来节省对象创建时间。(我不确定这是否会有影响requests例如,将它们视为不可变的,这样每次都会创建一个新对象。但这仍可能缩短输入验证时间或其他时间。)

相关问题 更多 >