2016-11-14 7 views
2

urllib3을 사용하여 웹을 크롤링하고 있습니다. 예제 코드 :파이썬 | HTTP - 다운로드하기 전에 파일 크기를 확인하는 방법

from urllib3 import PoolManager 

pool = PoolManager() 
response = pool.request("GET", url) 

문제는 내가 정말 큰 파일의 다운로드 내가 그것을 다운로드에 interseted하고 있지 않다 URL을 우연히 발견 할 수 있다는 것이다.

이 질문은 Link입니다. urlliburlopen을 사용하는 것이 좋습니다. 나는 서버에 두 번 연락하고 싶지 않다.

파일 크기를 25MB로 제한하고 싶습니다. urllib3으로이 작업을 수행 할 수있는 방법이 있습니까?

+0

25MB를 치고 다운로드를 취소 할 때까지 읽으시겠습니까? – jarmod

+0

그것은 옵션입니다. 내가 어떻게 할 수 있니? –

+3

HTTP HEAD verb를 사용하고 Content-Length 머리글을 읽으면 크기를 검색 할 수 있습니다. 서버가 Content-Length를 생략하면 jarmod가 언급 한대로 파일 다운로드를 시작하지 않는 한 크기를 확인할 방법이 없습니다. –

답변

2

서버가 Content-Length 헤더를 제공하는 경우 서버를 사용하여 나머지 본문 다운로드를 계속할지 여부를 결정할 수 있습니다. 서버가 헤더를 제공하지 않으면 더 이상 계속할 것인지 결정할 때까지 응답을 스트리밍해야합니다.

이렇게하려면 not preloading the full response인지 확인해야합니다.

from urllib3 import PoolManager 

pool = PoolManager() 
response = pool.request("GET", url, preload_content=False) 

# Maximum amount we want to read 
max_bytes = 1000000 

content_bytes = response.headers.get("Content-Length") 
if content_bytes and int(content_bytes) < max_bytes: 
    # Expected body is smaller than our maximum, read the whole thing 
    data = response.read() 
    # Do something with data 
    ... 
elif content_bytes is None: 
    # Alternatively, stream until we hit our limit 
    amount_read = 0 
    for chunk in r.stream(): 
     amount_read += len(chunk) 
     # Save chunk 
     ... 
     if amount_read > max_bytes: 
      break 

# Release the connection back into the pool 
response.release_conn() 
+0

이 시나리오에 대한 문서를 개선하기 위해 문제가 발생했습니다. 도움이되거나 도움이 될만한 추가 메모를 추가하십시오. https://github.com/shazow/urllib3/issues/1037 – shazow

+0

빠른 질문 : 그렇지 않습니다. 연결을 닫고 풀에 그냥 놓으면 다음 요청이 HTTP 응답을 인식하지 못하기 때문에 다운로드를 다시 시작하고 중단하지 않습니까? 강제로 닫아서는 안됩니까? – spectras

+0

@spectras 정직하게 말하면 솔직히 내 머리 꼭대기에서 무슨 일이 일어날 지 확신 할 수 없지만 실제로 연결을 복구하지 못하면 urllib3의 버그로 생각하고보고 해달라고 부탁합니다. :) 우리가 연결을 다시 사용하기 전에 우리가 수표를 찍을 것이라고 확신합니다. – shazow