В настоящее время я пытаюсь ускорить свои запросы, используя многопоточность, но я не уверен, как это сделать так, как я хочу. Я знаю о 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.
@ DroidX86 Ну, я мог бы попробовать, конечно. Но я хотел иметь возможность установить отправную точку и не иметь никаких ранее существовавших списков.
Если вам не нужны уже существующие списки, попробуйте написать генератор, который будет генерировать URL-адреса!
Ок, разобрался. Спасибо за совет.
Вот код:
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
Почему бы вам заранее не создать список URL-адресов, а затем отправить все запросы параллельно?