没有 URL 列表的多线程请求

Multithreading requests without a URL list

我目前正在尝试通过多线程处理来加快我的请求,但我不确定如何按照我想要的方式进行。我知道 grequests,但它们似乎需要一个 URL 列表。我有一个起始编号包含在 URL 中的代码,并希望所有线程在获得 status_code 的 200

后停止

我曾尝试通过 grequests 来完成此操作,但未能成功。还尝试了线程化,但不知道如何在工作后停止所有线程 URL was found

import requests
import webbrowser

def url_request(number):
    url = "http://website.com/download/" + str(number) + ".zip"
    r = requests.head(url)
    if r.status_code == 404:
        print(url + " - 404 Not Found!")
        number += 1
        url_request(number)
    elif r.status_code == 200:
        webbrowser.open(url)
        print(url + " - 200 Found!")

if __name__ == "__main__":
    url_request(int(input("Starting number: ")))

我想要代码做的是在 "Starting number" 之后使用数字一次执行多个 request.head 并且将在其中一个线程找到 url 和 [=20= 之后停止] 200.

好的,明白了。谢谢你的建议。

代码如下:

from gevent import monkey
monkey.patch_all()
import grequests
import webbrowser


def url_request_threaded(startnumber, stopnumber):
    urls = []
    for i in range(startnumber, stopnumber):
        urls.append("http://website.com/download/" + str(i) + ".zip")
    gr = (grequests.head(url, stream=False) for url in urls)
    gresponses = grequests.imap(gr, size=10)
    try:
        for response in gresponses:
            if response.status_code == 404:
                print(response.url + " - 404 Not Found!")
            elif response.status_code == 200:
                webbrowser.open(response.url)
                print(response.url + " - 200 Found!")
                raise SystemExit
    except SystemExit:
        pass


if __name__ == "__main__":
    while True:
        try:
            startn = input("Starting number: ")
            startn = int(startn)
            stopn = input("End number: ")
            stopn = int(stopn)
            url_request_threaded(b, v, startn, stopn)
        except ValueError:
            print("Must be a number!")
            continue
        break