python 으로 웹서버상의 pdf 파일 다운로드방법
조회수 5441회
제가 짜려고 하는 코드는 구글 학술정보지에 나오는 논문 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 같은 경우로
구글 학술정보지에서 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>
-
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)
댓글 입력