2011-01-31 3 views
0

HTTP 웹 사이트에서 이미지를 다운로드하기 위해 python 스크립트를 작성했지만 urllib2를 사용하고 있기 때문에 기존 연결을 닫은 후 다른 연결을 열기 전에 다른 연결을 엽니 다. 나는 그 모든 것을 네트워킹하는 것을 정말로 이해하지 못한다. 그러나 이것은 아마도 일들을 상당히 늦추고, 한 번에 100 개의 이미지를 잡는 데는 상당한 시간이 걸릴 것이다.파이썬 : HTTP 서버에서 파일 다운로드하기

pycurl이나 httplib과 같은 다른 대안을 찾기 시작했지만, urllib2와 비교해 보면 알아 내기가 복잡하고 방금 가져다 쓸 수있는 많은 코드 스 니펫을 찾지 못했습니다.

단순히 웹 사이트에 대한 영구 연결을 설정하고 여러 개의 파일을 다운로드 한 다음 완료 될 때만 연결을 닫으려면 어떻게해야합니까? 당신이 socket을 열 수있는 복잡한 요청을하지 않을 경우

+0

일반적으로 이미지의 크기에 비해 네트워크 오버 헤드가 거의 없다고 생각합니다. 당신이 반대되는 증거가 없다면 문제의 가치가 없을 것입니다. – Thomas

+0

[Dive into Python] (http://diveintopython.org/http_web_services/index.html)도 비슷한 작업을 수행했습니다. –

+1

나는 네트워크 오버 헤드가 큰 차이를 내지 않는다는 것에 동의하지 않는다. TCP Slow Start (http://en.wikipedia.org/wiki/Slow-start) 때문에 새로 생성 된 모든 연결은 처음에는 느려질 것입니다. 따라서 동일한 TCP 연결을 재사용하면 데이터가 충분히 크면 차이가 발생합니다 (100 장의 사진은 10 ~ 100MB가됩니다) –

답변

2

에서 코드 샘플입니다 연결을 닫으십시오.

+0

고마워, 나는 이미지의 위치에 대한리스트를 만들 생각을 해본 적이 없다. Kevin, – MxyL

+0

좋아하는 대답을 –

+0

시도했습니다. 그렇게하기에 충분한 명성이 없습니다. – MxyL

0

를 (아마도 명시 적 호출을 닫습니다)와 같은 요청에게 자기를합니다

import sockets 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((server_name, server_port)) 

for url in urls: 
    sock.write('get %s\r\nhost: %s\r\n\r\n' % (url, server_name)) 
    # Parse HTTP header 
    # Download picture (Size should be in the HTTP header) 

sock.close() 

하지만 100 TCP를 확립 생각하지 않는다 세션은 일반적으로 많은 오버 헤드를 만듭니다.

1

나는 urllib3을 발견했으며 기존 TCP 연결을 재사용한다고 주장합니다.

나는 클레임에 동의하지 않는다는 의견에 이미 언급했듯이 큰 차이를 만들지는 않을 것이다. TCP Slow Start 새로 생성 된 모든 연결은 처음에는 느릴 것이기 때문이다. 데이터가 큰 경우 동일한 TCP 소켓을 재사용하면 차이가 발생합니다. 그리고 나는 100에 대한 데이터가 10과 100 MB 사이라고 생각합니다.

import httplib 

images = ['img1.png', 'img2.png', 'img3.png'] 

conn = httplib.HTTPConnection('www.example.com') 

for image in images: 
    conn.request('GET', '/images/%s' % image) 
    resp = conn.getresponse() 
    data = resp.read() 
    with open(image, 'wb') as f: 
     f.write(data) 

conn.close() 

이 여러 (순차적)를 발행 할 목록에서 이미지에 대한 요청을 GET 다음 : 당신은 HTTPLIB 조각을 요구하기 때문에 여기에

http://code.google.com/p/urllib3/source/browse/test/benchmark.py

TO_DOWNLOAD = [ 
'http://code.google.com/apis/apps/', 
'http://code.google.com/apis/base/', 
'http://code.google.com/apis/blogger/', 
'http://code.google.com/apis/calendar/', 
'http://code.google.com/apis/codesearch/', 
'http://code.google.com/apis/contact/', 
'http://code.google.com/apis/books/', 
'http://code.google.com/apis/documents/', 
'http://code.google.com/apis/finance/', 
'http://code.google.com/apis/health/', 
'http://code.google.com/apis/notebook/', 
'http://code.google.com/apis/picasaweb/', 
'http://code.google.com/apis/spreadsheets/', 
'http://code.google.com/apis/webmastertools/', 
'http://code.google.com/apis/youtube/', 
] 

from urllib3 import HTTPConnectionPool 
import urllib 

pool = HTTPConnectionPool.from_url(url_list[0]) 
for url in url_list: 
    r = pool.get_url(url) 
+0

나는 urllib3을보고 내가 할 수있는 것을 보게 될 것이다. 최근에 pycurl을 설치하고 연결을 설정하기 위해 여러 스레드를 실행하는 예제 코드를 사용했지만 코드를 이해하지 못하고 지금까지 복사/붙여 넣기 만 할 수 있습니다. – MxyL

관련 문제