복붙노트

[PYTHON] 파이썬을 사용하여 많은 파일 다운로드하기

PYTHON

파이썬을 사용하여 많은 파일 다운로드하기

파이썬을 사용하여 한꺼번에 많은 파일을 다운로드하는 좋은 방법이 있습니까? 이 코드는 약 100 개 정도의 파일을 다운로드 할 수있을만큼 빠릅니다. 하지만 300,000 개의 파일을 다운로드해야합니다. 분명히 그들은 모두 매우 작은 파일입니다 (또는 나는 그 중 300,000을 다운로드하지 않을 것입니다 :)) 그래서 실제 병목 현상이이 루프 인 것으로 보입니다. 누구든지 어떤 생각을 가지고 있습니까? 어쩌면 MPI 또는 스레딩을 사용하고 있을까요?

병목 목에 살고 있어야하나요? 또는 더 빠른 방법이 있습니까? 아니면 파이썬을 사용하지 않았습니까?

(나는 완전성을 위해 코드의 전체 시작 부분을 포함시켰다)

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

해결법

  1. ==============================

    1.다중 처리의 일반적인 패턴은 인수를 취하고 잠재적으로 CPU 바운드 작업을 수행하는 job () 함수를 만드는 것입니다.

    다중 처리의 일반적인 패턴은 인수를 취하고 잠재적으로 CPU 바운드 작업을 수행하는 job () 함수를 만드는 것입니다.

    예 : (귀하의 코드를 기반으로)

    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)
    

    이것은 여러 가지 일을 할 것입니다 :

    파이썬의 멀티 프로세싱 .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()
    

    작업이 진행됨에 따라 진행 상황 및 η 등을 알기 쉽게 진행 상태를 확인할 수 있습니다.

    또한 요청 라이브러리는 여기에서 매우 유용하며 웹 리소스 처리 및 콘텐츠 다운로드를위한 API (일련 번호 세트)가 훨씬 유용합니다.

  2. from https://stackoverflow.com/questions/24398044/downloading-a-lot-of-files-using-python by cc-by-sa and MIT license