为什么这个小python脚本如此之慢?也许使用错误的lib?建议?

时间:2018-02-24 10:21:32

标签: python urllib

我在高中训练蟒蛇。我们还在学习。 我们做了这个小脚本,它使用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)

出了什么问题这是我最好的......相信我并没有睡觉让它发挥作用

0 个答案:

没有答案