2014-04-07 2 views
0

나는 내가 실제로 달리고있는 문제로 당황하고있다. imgur에서 이미지 파일을 다운로드하는 스크립트가 있습니다. 스크립트는 요청 모듈을 사용합니다. 본질적으로 바이트 스트림으로 링크를 여는 요청이 만들어진 다음 파일은 청크로 다운로드되고 메모리 내 버퍼에 저장됩니다. 다음은 내가하는 일의 아주 간단한 버전입니다.파일 크기 차이 - 요청 모듈 대 크롬

page_binary_string = io.BytesIO 
response = requests.get(url, stream=True) 
for chunk in response.iter_content(CHUNK_SIZE, decode_unicode): 
    page_binary_string.write(chunk) 

이 경우 decode_unicode는 false로 설정됩니다. 그때

image_file = open(path, 'wb') # Open file for updating 
image_file.write(page_binary_string.read(page_binary_string.size)) 

내가 파일 시스템의 결과 파일을 볼 때, 그것은 브라우저가 다운로드 한 파일의 크기의 1/20 사용하여 파일에 결과 스트림 쓰기! 브라우저에이 파일을 다운로드하는 경우 http://i.imgur.com/VbauZys.jpg

, 당신이 2백44킬로바이트 것을 볼 수 있습니다 여기에

내가 순간에 실험하고있는 링크입니다. 디스크의 파일을 보면 10KB 밖에되지 않습니다. 이 크기 차이는 이미지를 열 때 분명합니다. 품질이 크게 저하되었습니다.

누구에게 이런 일이 일어나는 이유와 해결 방법이 있습니까? HTTP 헤더 (encodings ??)와 함께 뭔가 내 첫 번째 추측했지만, 난 정말 이걸 팔지 않아.

답변

1

왜 io.ByteStream을 사용해야하는 특별한 이유가없는 경우 요청 모듈의 자체 원시 콘텐츠 기능을 사용할 수 있습니다. 여기를 보시길 바랍니다 http://docs.python-requests.org/en/latest/user/quickstart/#binary-response-content 그런 식으로하거나 바이너리 모드로 파일을 열 수 있습니다 (open ('somefile.jpg', 'wb')). 그리고 거기에 내용을 빠르고 더러운 내용으로 덤프 할 수 있습니다.

+0

전체 요청을 다른 개체 (이미지 또는 파일)로 덤프하는 경우 응답의 전체 내용을 다운로드합니다. 나는 전체 크기 (http 응답 헤더가 잘못되었을 수도 있음)를 추적 할 수 있도록 청크로 응답을 반복합니다. 응답의 크기가 설정된 값을 초과하면 다운로드를 중단합니다. 이 API는 일반인이 액세스 할 수 있으므로 악의적 인 사용자를 고려해야했습니다. – Nick

0

나는주의를 기울이고 싶다. 이미지 형식을 다운 스트림으로 변경했습니다. 위의 코드가 작동합니다