如何优化此 for-with 循环?



我写了一个脚本来从维基百科下载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 分钟才能收到下一个请求。 这意味着问题与"下载大文件"无关,而与"如何下载大量非常小的文件?

我想现在的问题应该是:有谁知道你需要添加多少延迟才能解决这个问题? 您是否同意我的观点,即"滞后"一定是由于在太短的时间内发送太多请求造成的?

如果您遇到大型 pdf 文件,注释中的建议很好。即使使用较小的文件,您也可以获得更快的结果,如果您以刮擦异步方式下载

至于代码美学,您可以将每个单独的责任放在单个功能上,例如:

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)

希望对您有所帮助。

最新更新