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

조회수 5424회

제가 짜려고 하는 코드는 구글 학술정보지에 나오는 논문 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을 이용하여 파일을 다운로드 할 경우 읽을 수 없는 파일이라고 나왔습니다.

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

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>                                                                                                   
      
    • 특이한 문제가 없다는게 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)
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)