2009-06-10 3 views
8

웹 사이트에서 Gbs 데이터를 다운로드하는 작업이 있습니다. 데이터는 .gz 파일 형식이며 각 파일의 크기는 45MB입니다.wget Vs urlretrieve of python

"wget ​​-r -np -A files url"을 사용하면 파일을 쉽게 얻을 수 있습니다. 이렇게하면 재귀 적 형식으로 데이터를 가져 오지 않고 웹 사이트를 반영합니다. 부하가 걸리는 속도는 4mb/sec로 매우 높습니다.

하지만 주위를 놀기 위해서도 파이썬을 사용하여 urlparser를 빌드하고있었습니다.

Python의 urlretrieve를 통해 다운로드하는 것은 천천히, 가능한 wget만큼 느리게 4 배입니다. 다운로드 속도는 500kb/초입니다. href 태그를 구문 분석하기 위해 HTMLParser를 사용합니다.

왜 이런 일이 발생하는지 잘 모르겠습니다. 이에 대한 설정이 있습니까?

감사합니다.

+1

CPU 사용량과 tcpdump 출력을 비교해 보셨습니까? –

+0

tcpdump 무엇입니까? 그것을 얻는 방법? –

+1

전송 속도 (메가 바이트/메가 바이트/메가 비트/메가 바이트는 완전히 다릅니다!)를 무시하고 'time wget http : // example.com/file' 및'time python urlretrieve_downloader.py' 명령을 사용하여 두 가지를 비교합니다. – dbr

답변

1

아마도 파이썬에서 데이터를 검사하고 검사 할 수 있습니까?

+0

죄송합니다. 나는 당신이 의미하는 바를 이해할 수 없습니다. 파이썬 코드에서 wget을 호출한다고 말하고 있습니까? –

+0

셸에서 또는 빠른 다운로드 속도를 활용하여 파이썬을 사용하여 데이터를 처리 할 수 ​​있습니다. –

0

실제로 차이가 없어야합니다. 모든 urlretrieve는 간단한 HTTP GET 요청을합니다. 데이터 처리 코드를 가져 와서 wget과 순수 파이썬의 직접적인 처리량 비교를 수행 했습니까?

0

일부 코드를 알려주십시오. 나는 코드가 있어야하고 urlretrieve가 아니라고 확신한다.

저는 과거와 함께 작업 해본 적이 있으며 속도 관련 문제가 없었습니다.

+0

다음은 코드입니다 ... http : //cs.jhu.edu/~kapild/MyHtmlParser1.py urlretrieve는 두 번째 마지막 줄에 있습니다 –

1
import subprocess 

myurl = 'http://some_server/data/' 
subprocess.call(["wget", "-r", "-np", "-A", "files", myurl]) 
+0

하위 프로세스는 친구입니다 :-) –

3

/쉬운 당신은 아마 HTTP에 관해서는 lxml 을 사용하는 얻을 것이다 것은 자신을 요청합니다 httplib2은 사용이 매우 쉽고, 그것을 지원하기 때문에 가능 다운로드 속도를 높일 수있는 HTTP 1.1 연결 유지 연결 및 gzip 압축. 매우 빠른 (그러나 사용하기가 더 어렵습니다)라고 주장하는 pycURL도 있으며, curllib를 기반으로 작성되었지만 사용하지는 않았습니다.

다른 파일을 동시에 다운로드 할 수도 있지만 다운로드 시간을 너무 많이 최적화하면 문제가되는 웹 사이트가 너무 정중하지 않을 수 있습니다.

하이퍼 링크의 부족에 대한 미안하지만, SO 알려줍니다 다음과 같은 스크립트로 시도 할 수

+0

추가됨 나중에, newb에 대한 몇 가지 링크 :) – Triptych

+0

나는 파싱이 문제인지 모르겠다 ... 그것의 검색 및 지연을 일으키는 파일을 저장하는 중 ... –

3

전송 속도가 쉽게 오해의 소지가 될 수 있습니다 .. "죄송합니다, 새로운 사용자는 하나의 하이퍼 링크의 최대를 게시 할 수 있습니다"하는 과 urllib.urlretrieve이있는 동일한 URL을 다운로드합니다. 두 번째 시도에서 URL을 캐시하는 프록시를 사용하고있는 경우 몇 번 실행하십시오.

작은 파일의 경우 외부 프로세스의 시작 시간 때문에 wget이 약간 더 오래 걸리지 만 큰 파일은 관련성이 없어야합니다.

from time import time 
import urllib 
import subprocess 

target = "http://example.com" # change this to a more useful URL 

wget_start = time() 

proc = subprocess.Popen(["wget", target]) 
proc.communicate() 

wget_end = time() 


url_start = time() 
urllib.urlretrieve(target) 
url_end = time() 

print "wget -> %s" % (wget_end - wget_start) 
print "urllib.urlretrieve -> %s" % (url_end - url_start) 
8

urllib는 wget만큼 빠른 속도로 작동합니다. 이 코드를 사용해보십시오. 그것은 wget과 마찬가지로 백분율로 진행률을 보여줍니다.

import sys, urllib 
def reporthook(a,b,c): 
    # ',' at the end of the line is important! 
    print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b)/c * 100), c), 
    #you can also use sys.stdout.write 
    #sys.stdout.write("\r% 3.1f%% of %d bytes" 
    #     % (min(100, float(a * b)/c * 100), c) 
    sys.stdout.flush() 
for url in sys.argv[1:]: 
    i = url.rfind('/') 
    file = url[i+1:] 
    print url, "->", file 
    urllib.urlretrieve(url, file, reporthook) 
0

당신은 모든 URL에 관련 링크를 참여 wget -k를 사용할 수 있습니다. 파이썬은 urllib2 대신 urllib을 사용하여 제안 이후

1

, 나는 urllib2.urlopenwget 사이에 시험을.

결과적으로 두 파일 모두 동일한 파일을 다운로드하는 데 거의 같은 시간이 걸립니다. 가끔 urllib2이 더 잘 수행됩니다.

wget의 장점은 전송할 때 완료율과 현재 다운로드 속도를 보여주는 동적 진행률 막대에 있습니다.

내 테스트의 파일 크기는 5MB입니다. 파이썬에서 캐시 모듈을 사용하지 않았으며 큰 크기의 파일을 다운로드 할 때 wget이 어떻게 작동하는지 알지 못합니다.