python 으로 웹서버상의 pdf 파일 다운로드방법


제가 짜려고 하는 코드는 구글 학술정보지에 나오는 논문 pdf파일들을 html상의 다운로드 주소를 통해 일괄 다운로드하여 어떤 코드를 짜보려고하고 있습니다. 그런데 이 다운로드 과정에서 몇가지 문제가 발생하였는데, 우선 제가 실행한 코드를 보면

def get_download(url,fname,directory):
      try:
        os.chdir(directory)
        print(url)
        request.urlretrieve(url,fname)
        print('다운로드 완료')
    except HTTPError as e:
        print(e)
        return None

여기서 request.urlretrieve를 사용하여 파일을 다운받을때 세가지경우가 나왔습니다

첫번째는 다행히 다운로드가 잘 받아지는경우,

두번째는 http 에러가 발생하는경우,

세번째는 다운로드가 실행은 되나 pdf파일이 사용할수 없다고 나오는 경우입니다.

여기서

두번째의경우는

예를들어 url:http://www.academia.edu/download/35716149/leach.pdf 같은 경우로

(실제url:https://s3.amazonaws.com/academia.edu.documents/35716149/leach.pdf?AWSAccessKeyId=AKIAIWOWYYGZ2Y53UL3A&Expires=1514444614&Signature=A6SdIuGn4hxxEcZjQTWsZmxg%2Fx0%3D&response-content-disposition=inline%3B%20filename%3DEnergy-Efficient_Communication_Protocol.pdf)

구글 학술정보지에서 pdf버튼을 클릭했을때 들어가지는 url과 html파일안에 명시된 url이 다른경우 인데요 이경우는 방법을 못찾겠어서 일단 예외로 처리하였고,

세번째의 경우에는

url:http://journals.sagepub.com/doi/pdf/10.1038/jcbfm.1993.48같은 경우인데,

url이 pdf파일을 직접적으로 명시하지 않아서 그런건지 url을 이용하여 파일을 다운로드 할 경우 읽을 수 없는 파일이라고 나왔습니다.

이런 문제를 해결하기 위해서는 어떤부분을 공부해야하는지 알고싶습니다.

  • 2017년 12월 28일에 작성됨

조회수 107


2 답변


무엇이 문제라고 하는지 모르겠습니다.

아래를 보시면 특이한 문제가 없습니다.

  • request header

    GET http://journals.sagepub.com/doi/pdf/10.1038/jcbfm.1993.48 HTTP/1.1
    Host: journals.sagepub.com
    Connection: keep-alive
    Cache-Control: max-age=0
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
    Upgrade-Insecure-Requests: 1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: ko,en-US;q=0.9,en;q=0.8,ja;q=0.7
    Cookie: timezone=540; I2KBRCK=1; SERVER=WZ6myaEXBLGzzb+3qD0SOQ==; SERVER=WZ6myaEXBLGzzb+3qD0SOQ==; MAID=lPQzpL4VA36/hXTPEnQenQ==; MAID=lPQzpL4VA36/hXTPEnQenQ==; MACHINE_LAST_SEEN=2017-12-28T00%3A18%3A08.075-08%3A00; MACHINE_LAST_SEEN=2017-12-28T00%3A18%3A08.075-08%3A00; JSESSIONID=aaahTMzn7gPiC5lBZTUbw; JSESSIONID=aaahTMzn7gPiC5lBZTUbw; _ga=GA1.2.826585137.1514449083; _gid=GA1.2.907697027.1514449083
    
  • response header

    HTTP/1.1 200 OK
    Server: AtyponWS/7.1
    Cache-Control: max-age=3600, private, must-revalidate
    Pragma: 
    X-Webstats-RespID: ad685cea9103f80c95659addb3e4e5a1
    Content-Disposition: inline; filename=jcbfm.1993.48.pdf
    Set-Cookie: JSESSIONID=aaahTMzn7gPiC5lBZTUbw; domain=.journals.sagepub.com; path=/
    Content-Type: application/pdf; charset=UTF-8
    Date: Thu, 28 Dec 2017 08:35:26 GMT
    Content-Length: 236399
    
  • 본문일부

    %PDF-1.5
    %    
    1 0 obj
    <</Subtype/XML/Type/Metadata/Length 3356>>stream
    <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
    <x:xmpmeta x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04        " xmlns:x="adobe:ns:meta/">
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
         <pdf:Producer>Adobe Acrobat 9.32 Paper Capture Plug-in with ClearScan; modified using iText 4.2.0 by 1T3XT</pdf:Producer>
      </rdf:Description>
      <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:ModifyDate>2017-12-28T00:35:26-08:00</xmp:ModifyDate>
         <xmp:CreateDate>2010-08-07T16:12:40+05:30</xmp:CreateDate>
         <xmp:MetadataDate>2017-12-28T00:35:26-08:00</xmp:MetadataDate>
         <xmp:CreatorTool>Acrobat 5.0 Image Conversion Plug-in for Windows</xmp:CreatorTool>
      </rdf:Description>
      <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
         <xmpMM:DocumentID>uuid:d5bdf982-82e0-4b0a-b3a8-da3bc7602a85</xmpMM:DocumentID>
         <xmpMM:InstanceID>uuid:896cd839-1aab-41fb-a5f6-6cd7d16f5e06</xmpMM:InstanceID>
      </rdf:Description>
      <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>application/pdf</dc:format>
      </rdf:Description>
    </rdf:RDF>
    </x:xmpmeta>                                                                                                   
    
  • 2017년 12월 28일에 작성됨

  • 특이한 문제가 없다는게 urlretrieve로 다운받을 수 있다는건가요?? 위에 제가 올린 코드로 받으면 파일에 문제가 생겨서요.. 어떤식으로 다운로드를 해야할지 모르겠습니다..    최성욱   2017.12.29 10:07     

http 는 프로토콜입니다.

즉 규약대로 동작을 합니다.

헤더 정보를 볼 때 문제가 없습니다.

실제로 아래의 코드 수행시 정상적인 pdf 파일을 다운 받습니다.

import requests
import shutil

res = requests.get('http://journals.sagepub.com/doi/pdf/10.1038/jcbfm.1993.48', stream=True)

with open('/home/allinux/abcd.pdf', 'wb') as f:
    res.raw.decode_content = True
    shutil.copyfileobj(res.raw, f)
  • 2017년 12월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close