如何优化这个forwith循环?

2024-04-20 01:00:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个脚本从维基百科下载PDF文件。 我实现了一个循环来遍历所有要下载的url(我将它们保存在一个.csv文件中)。最初的几个文件下载得相当快(难怪,它们的大小只有200kB),但过了一段时间,下载需要的时间越来越长。 感觉我的循环有指数级的增长,这使得每次迭代后我的循环速度慢了很多。 可能是请求没有按正确的方式关闭或者什么的,我真的不知道。你知道吗

有人能帮我把这个代码做得不那么糟糕,更有效吗? urlstitles都是列表。它们是从同一个函数传递过来的,所以我可以把它们转换成字典。你知道吗

    def getPDF(urls, titles, path):
    i = 0
    for i in range(len(urls) - 1):
        i += 1
        with open(path + '/{}.pdf'.format(titles[i]), 'wb') as f:
            with requests.session() as s:
                r = s.get(urls[i])
                f.write(r.content)
        print('{}.pdf'.format(titles[i]) + ' downloaded!')

编辑: 一定和请求有关。我添加了一个函数来打印下载所用的时间(从getPDF()的第一行到print()行)。结果如下:

Downloads werden gestartet, das Programm beendet automatisch...

Wirtschaft.pdf downloaded! (2.606057643890381sec)
Wirtschaftseinheit.pdf downloaded! (1.41001296043396sec)
Planung.pdf downloaded! (1.6632893085479736sec)
Bedürfnis#In den Wirtschaftswissenschaften.pdf downloaded! (1.4947214126586914sec)
Unternehmen.pdf downloaded! (2.317748546600342sec)
Privathaushalt.pdf downloaded! (122.32739114761353sec)
%C3%96ffentlicher Haushalt.pdf downloaded! (2.03417706489563sec)
Absatzwirtschaft.pdf downloaded! (0.8923726081848145sec)
Produktion.pdf downloaded! (0.2800614833831787sec)
Tausch.pdf downloaded! (1.5359272956848145sec)
Konsum.pdf downloaded! (121.9487988948822sec)
Entsorgungswirtschaft.pdf downloaded! (121.20771074295044sec)
Gut (Wirtschaftswissenschaft).pdf downloaded! (245.15847492218018sec)

Fertig!

注意:我把它放在代码中,这样它就可以格式化了,我希望这是好的。你知道吗

很明显,你在4次请求后得到类似“罢工”的结果,然后需要等待2分钟,最后你立即中风,甚至不得不等待4分钟等待下一次请求。 这意味着这个问题与“下载大文件”无关,而与“如何下载大量非常小的文件”有关。你知道吗

我想现在的问题应该是:有人知道为了解决这个问题,你需要增加多少延迟吗? 你同意我说的“延迟”一定是因为在太短的时间内发送了太多的请求吗?你知道吗


Tags: 文件path函数代码formatpdfaswith
1条回答
网友
1楼 · 发布于 2024-04-20 01:00:34

如果你遇到一个大的pdf文件,评论中的建议是很好的。如果使用scrapy异步下载,即使文件较小,也可以获得更快的结果

至于代码美学,你可以把每个单独的责任交给一个单独的功能,例如:

def fetch(url):
    with requests.session() as s:
        r = s.get(url)
        return (r.content)

您的主要辅助功能可以是:

def save_pdf(url, title, directory):
    filename = make_path(title, directory)
    with open(filename, 'wb') as f:
        content = fetch(url) 
        f.write(content)

和主回路控制回路:

for t in targets:
   savePDF(t['url'], t['title'], directory)

希望有帮助。你知道吗

相关问题 更多 >