簡體   English   中英

使用python下載很多文件

[英]Downloading a LOT of files using python

有沒有一種很好的方法可以使用python大量下載很多文件? 此代碼足夠快,可以下載大約100個文件。 但是我需要下載300,000個文件。 顯然它們都是很小的文件(或者我不會下載其中的300,000 :)),因此真正的瓶頸似乎是此循環。 有人有想法嗎? 也許使用MPI或線程?

我只需要忍受瓶頸嗎? 還是有更快的方法,也許甚至不使用python?

(為了完整起見,我包括了代碼的完整開頭)

from __future__ import division
import pandas as pd
import numpy as np
import urllib2
import os
import linecache 

#we start with a huge file of urls

data= pd.read_csv("edgar.csv")
datatemp2=data[data['form'].str.contains("14A")]
datatemp3=data[data['form'].str.contains("14C")]

#data2 is the cut-down file

data2=datatemp2.append(datatemp3)
flist=np.array(data2['filename'])
print len(flist)
print flist

###below we have a script to download all of the files in the data2 database
###here you will need to create a new directory named edgar14A14C in your CWD

original=os.getcwd().copy()
os.chdir(str(os.getcwd())+str('/edgar14A14C'))


for i in xrange(len(flist)):
    url = "ftp://ftp.sec.gov/"+str(flist[i])
    file_name = str(url.split('/')[-1])
    u = urllib2.urlopen(url)
    f = open(file_name, 'wb')
    f.write(u.read())
    f.close()
    print i

帶有多處理的通常模式是創建一個job()函數,該函數接受參數並執行一些可能與CPU綁定的工作。

示例:( 根據您的代碼

from multiprocessing import Pool

def job(url):
    file_name = str(url.split('/')[-1])
    u = urllib2.urlopen(url)
    f = open(file_name, 'wb')
    f.write(u.read())
    f.close()

pool = Pool()
urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist]
pool.map(job, urls)

這會做很多事情:

  • 當您擁有CPU或CPU核心時,創建一個多處理池和一組工作程序
  • 創建job()函數的輸入列表。
  • 將輸入urls列表映射到job()然后等待所有作業完成。

Python的multiprocessing.Pool.map將負責將您的輸入划分為no。 池中的工人。

我為這類工作所做的另一項有用的整潔小事情是使用如下所示的進度

from multiprocessing import Pool


from progress.bar import Bar


def job(input):
    # do some work


pool = Pool()
inputs = range(100)
bar = Bar('Processing', max=len(inputs))
for i in pool.imap(job, inputs):
    bar.next()
bar.finish()

隨着工作的進行,這在控制台上為您提供了一個不錯的進度條,因此您對進度和eta等有一些了解。

我還發現請求庫在這里非常有用,並且提供了一套更好的API,用於處理Web資源和內容下載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM