问题描述
我有大约 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()
我实际上尝试过这个,而且速度非常快。也许这是最快的“在请求部分”,但它是第一个准备过程吗? 这需要很多时间。
解决方法
您想研究 curl 的多接口,它在同一线程上进行并发传输。即使有 10 万个请求,您也受 I/O 限制。使用多接口后,您可以通过上述内部线程将工作负载分配到更多线程实例中,或者只是启动单独的进程(如果您使用的是 Linux,请参阅 xargs -P 或 GNU Parallel)。