0

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

我试图通过 grequests 来实现这一点,但无法使其发挥作用。也尝试过线程,但不知道如何在找到工作 URL 后停止所有线程

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: ")))

我想要代码做的是request.head在“起始编号”之后使用一个数字一次执行多个,并在其中一个线程找到状态码为 200 的 url 后停止。

4

1 回答 1

0

好的,想通了。谢谢你的建议。

这是代码:

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

于 2019-04-08T19:42:07.173 回答