我目前正在尝试通过对它们的多线程处理来加快请求的速度,但是我不确定如何按照自己的方式进行。我知道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后将停止执行。
答案 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