没有URL列表的多线程请求

时间:2019-04-08 16:43:56

标签: python python-requests grequests

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

我已经尝试通过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后将停止执行。

1 个答案:

答案 0 :(得分: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

相关问题