首页 > 解决方案 > 使用 Python3 发送 100,000 个 Web 请求的最快方法是什么?

问题描述

我有大约 100,000 个 URL 列表。所有都在同一个域中,并且具有不同的子目录。检查这 100,000 个 URL 列表的状态代码的最快方法是什么?我目前正在使用线程和 PyCurl 发出请求,如下所示。如何更有效地创建线程并使 Web 请求更快?

import pycurl
import certifi

from threading import Thread

def req(url, counter):
    try:
        curl = pycurl.Curl()
        curl.setopt(pycurl.CAINFO, certifi.where())
        curl.setopt(pycurl.WRITEFUNCTION, lambda x: None)
        curl.setopt(pycurl.CONNECTTIMEOUT, 5)
        curl.setopt(pycurl.URL,url)
        curl.perform()
        print(f"Requests: {counter} | URL: {url} | Status Code: {curl.getinfo(pycurl.HTTP_CODE)}")
        curl.close()

    except pycurl.error:
        pass

with open("urllist.txt") as f:
    urls = f.read().splitlines()

counter = 0

while True:
    for url in urls:
        counter += 1
        Thread(target=req, args=(url, counter, )).start()

附加说明,你提出了一个类似的问题,所以我把它链接了。

我实际上试过这个,它非常快。也许这是最快的“在请求部分”,但它是第一个准备过程吗?这需要很多时间。

标签: pythonpython-requestspycurl

解决方案


您想查看 curl 的多接口,它在同一线程上进行并发传输。即使有 100k 个请求,您也是 i/o 绑定的。使用多接口后,您可以通过上述内部线程将工作负载拆分到更多线程实例中,或者只启动单独的进程(如果您在 Linux 上,请参阅 xargs -P 或 GNU Parallel)。


推荐阅读