Многопоточные запросы без списка URL

В настоящее время я пытаюсь ускорить свои запросы, используя многопоточность, но я не уверен, как это сделать так, как я хочу. Я знаю о grequests, но они, похоже, требуют списка URL. У меня есть код с начальным номером, содержащимся в URL-адресе, и я хотел бы, чтобы все потоки останавливались после получения кода состояния 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 с номером после «Начального номера» и останавливался после того, как один из потоков найдет URL-адрес с кодом состояния 200.

Почему бы вам заранее не создать список URL-адресов, а затем отправить все запросы параллельно?

rdas 08.04.2019 18:46

@ DroidX86 Ну, я мог бы попробовать, конечно. Но я хотел иметь возможность установить отправную точку и не иметь никаких ранее существовавших списков.

kreny 08.04.2019 19:04

Если вам не нужны уже существующие списки, попробуйте написать генератор, который будет генерировать URL-адреса!

rdas 08.04.2019 19:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ок, разобрался. Спасибо за совет.

Вот код:

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

Другие вопросы по теме