我在高中训练蟒蛇。我们还在学习。 我们做了这个小脚本,它使用cookie加载网站并下载每个400k的文件。但由于某种原因,它非常缓慢。我们的互联网连接非常快。它应该能够一次下载20-30个文件,但由于某种原因,它一次只下载一个文件,并且在下载下一个文件之前仍然等待几秒钟。为什么会这样?请检查脚本并提出建议。无论我们在哪里运行脚本,它总是每分钟下载最多7-8个文件。这不对。
退房:
import urllib.request,string,random
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
ab = 0
faturanum = 20184009433300
while (ab != 1000000):
try:
ab = ab + 1
opener = urllib.request.build_opener()
a = id_generator() + ".pdf"
faturanum = faturanum - 1
fatura = str(faturanum)
faturanome = fatura + ".pdf"
opener.addheaders = [('Cookie', 'ASP.NET_SessionId=gpkufgrfzsk5abc0bc2v2v3e')]
f = opener.open("https://urltest.com/Fatura/Pdf?nrFatura="+fatura)
file = open(faturanome, 'wb')
file.write(f.read())
file.close()
print("file downloaded:"+str(ab)+" downloaded!")
except:
pass
为什么这么慢?远程服务器也非常快。有没有办法获得更好的结果?也许在队列中放几个文件?就像我说的,我们还在学习。我们只想找到一种方法,即脚本一次完成几个任务,一次获取多个文件,而不是一次一个。
所以这是我在下班后写的......但是不起作用
嗯,我们走了。
我做错了什么?我尽力而为,但我以前从未使用过线程。嘿@KlausD,检查一下,让我知道我做错了什么?这是一个需要cookie的网站。还需要加载ul并转向pdf。
检查我的代码尝试
import os
import threading
import urllib.request,string,random
from queue import Queue
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
class Downloader(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
url = self.queue.get()
self.download_file(url)
self.queue.task_done()
def download_file(self, url):
faturanum = 20184009433300
ab = ab + 1
handle = urllib.request.urlopen(url)
a = id_generator() + ".pdf"
faturanum = faturanum - 1
fatura = str(faturanum)
faturanome = fatura + ".pdf"
handle.addheaders = [('Cookie', 'ASP.NET_SessionId=v5x4k1m44saix1f5hpybf2qu')]
fname = os.path.basename(url)
with open(fname, "wb") as f:
while True:
chunk = handle.read(1024)
if not chunk: break
f.write(chunk)
def main(urls):
queue = Queue()
for i in range(5):
t = Downloader(queue)
t.setDaemon(True)
t.start()
for url in urls:
queue.put(url)
queue.join()
if __name__ == "__main__":
urls = ["https://sitetest.com/Fatura/Pdf?nrFatura="+fatura"]
main(urls)
出了什么问题这是我最好的......相信我并没有睡觉让它发挥作用