使用python快速下载文件

时间:2014-10-01 13:23:44

标签: python web urllib

我目前正在尝试从超过800,000个网址下载文件。每个网址都代表.txt文件。

我使用dataframe存储所有

网址信息:

index       Filename                                         
4           .../data/1000015/0001104659-05-006777.txt
5           .../data/1000015/0000950123-05-003812.txt
......

代码:

  for i in m.index:
     download = 'ftp:/.../' + m['Filename'][i]
     print download
     urllib.urlretrieve(download, '%s''%s.txt' % (m['Co_name'][i], m['Date'][i]))

此方法有效,但速度非常低,它在7分钟内下载了15个文件。考虑到我有超过800,000个文件。这是超过9个月......所以我想知道有人可以帮我改进吗?非常感谢你。


经过一些非常有用的评论,我做了一些修改,以下是进行多处理的好方法吗?

代码:

def download(file):
  import ftplib
  ftp = ftplib.FTP('XXXX')
  ftp.login()
  for i in m.index:
  a = m['Filename'][i]
  local_file = os.path.join("local_folder", '%s %s.txt' % (m['Co_name'][i], m['Data'][i]))
  fhandle = open(local_file,'wb')
  print fhandle
  ftp.retrbinary('RETR '+a, fhandle.write)
  fhandle.close()

m=pd.read_csv('XXXX.csv', delimiter=',', index_col='index')

pool = Pool(10)
pool.map(download, m)

1 个答案:

答案 0 :(得分:1)

这样,您可以为每个文件建立新连接。这意味着每下载任何内容的文件都会丢失几秒钟。

您可以使用ftplib(https://docs.python.org/2/library/ftplib.html)来减少这种情况,它允许建立单个连接并通过此连接逐个检索一个文件。

但是,有时间没有数据传输。要使用最大带宽,请使用线程并行下载多个文件。但请注意,某些服务器会限制并行连接的数量。

然而,时间开销不应超过几秒,在最坏的情况下可以说是5。然后,对于100kB文件大约25秒非常慢。 我猜你的连接很慢,或服务器是。如果FTP不是标准方式,可能是主机的FTP服务器在连接终止时关闭并在建立连接时启动?然后,FTPlib应该有所帮助。 然而,半秒的开销意味着400,000秒的等待。因此,并行下载是有道理的。

可能是,你首先尝试像filezilla这样的FTP客户端,并检查它可能带有什么带宽。