본문 바로가기
컴퓨터/Python

[파이썬] URL 살아있는지 검사 - 주소가 200 인지 체크 - HTTP 응답 상태 코드

by HanJoohyun 2019. 3. 6.
반응형



안녕하세요 한주현입니다.

오늘은 URL이 살아있는지 검사하는 방법을 파이썬으로 작성해보겠습니다.


목차

1. HTTP 응답 상태 코드
2. Python으로 HTTP 응답코드 가져오기




1. HTTP 응답 상태 코드

저의 경험에 비춰 많이 본 것만 작성해보겠습니다.


200 (성공, Success)
서버에 요청한 페이지가 성공적으로 처리되었음을 의미

403 (금지, Forbidden)
권한이 없는 등의 이유로 서버에 요청한 페이지가 제공 거부되었음을 의미

404 (찾을 수 없음, Not Found)
서버에 요청한 페이지가 존재하지 않음을 의미

500 (내부 서버 오류, Internal Server Error)
서버의 오류로 페이지가 제공되지 않음을 의미


다른 응답 상태 코드가 여럿 있습니다.
자세한 내용은  다음 링크를 참고해주세요.




2. Python으로 HTTP 응답코드 가져오기

파이썬으로 HTTP의 응답코드를 가져오는 방법은 

urllib.request 를 사용하면 됩니다. 다음 코드를 보시죠.

1
2
3
4
5
6
7
8
#!/usr/bin/python3
 
import urllib.request
 
url = "https://korbillgates.tistory.com"
res = urllib.request.urlopen(url)
print(res.status)  ## 200
 

urllib.request.urlopen() 메서드로 url 을 열면 HTTPResponse 객체가 만들어지고

저는 이 객체를 res 변수에 담았습니다.

res 변수에 담긴 HTTPResponse 객체의 status 속성을 출력해보면 200이 나오게 됩니다.




만약 없는 주소를 넣게 되면 어떻게 될까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import urllib.request
 
url = "https://zsdifje.tistory.com"
res = urllib.request.urlopen(url)
print(res.status)
 
 
---------------------------------------------------------------------------
HTTPError                                 Traceback (most recent call last)
<ipython-input-6-2f14277b3a5b> in <module>()
      2 
      3 url = "https://zsdifje.tistory.com"
----> 4 res = urllib.request.urlopen(url)
      5 print(res.status)
 
/home/jhan/anaconda3/lib/python3.6/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    221     else:
    222         opener = _opener
--> 223     return opener.open(url, data, timeout)
    224 
    225 def install_opener(opener):
 
/home/jhan/anaconda3/lib/python3.6/urllib/request.py in open(self, fullurl, data, timeout)
    530         for processor in self.process_response.get(protocol, []):
    531             meth = getattr(processor, meth_name)
--> 532             response = meth(req, response)
    533 
    534         return response
 
/home/jhan/anaconda3/lib/python3.6/urllib/request.py in http_response(self, request, response)
    640         if not (200 <= code < 300):
    641             response = self.parent.error(
--> 642                 'http', request, response, code, msg, hdrs)
    643 
    644         return response
 
/home/jhan/anaconda3/lib/python3.6/urllib/request.py in error(self, proto, *args)
    568         if http_err:
    569             args = (dict, 'default''http_error_default'+ orig_args
--> 570             return self._call_chain(*args)
    571 
    572 # XXX probably also want an abstract factory that knows when it makes
 
/home/jhan/anaconda3/lib/python3.6/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    502         for handler in handlers:
    503             func = getattr(handler, meth_name)
--> 504             result = func(*args)
    505             if result is not None:
    506                 return result
 
/home/jhan/anaconda3/lib/python3.6/urllib/request.py in http_error_default(self, req, fp, code, msg, hdrs)
    648 class HTTPDefaultErrorHandler(BaseHandler):
    649     def http_error_default(self, req, fp, code, msg, hdrs):
--> 650         raise HTTPError(req.full_url, code, msg, hdrs, fp)
    651 
    652 class HTTPRedirectHandler(BaseHandler):
 
HTTPError: HTTP Error 404: Not Found


여러가지 오류가 나옵니다만 마지막을 보시면 HTTPError가 있습니다.

이 부분을 try - except 로 잡아서 응답코드를 출력해보죠.



1
2
3
4
5
6
7
8
9
10
11
12
from urllib.request import urlopen
from urllib.error import URLError, HTTPError
 
url = "https://zsdifje.tistory.com"
try:
    res = urlopen(url)
    print(res.status)
except HTTPError as e:
    err = e.read()
    code = e.getcode()
    print(code) ## 404
 

try-except 로 HTTPError를 잡아 오류 코드를 출력해보았습니다.

주소가 없다면 404가 출력되는 것이 맞습니다.


활용 방법

그냥 마우스로 클릭해서 링크가 살았는지 죽었는지 체크하면 될것을...

대체 이걸 어디에 쓸까 싶지만,

생각해보면 쓸만 한 곳이 여러군데 있습니다.


예를 들어, 여러 주소들이 있습니다. 1,000개의 생물정보학 관련 파일을 다운로드 받을 주소가 있다고 해보죠.

이 주소들 중에서 안되는 것을 골라내야 합니다... ㅋㅋ..

그러면 파이썬 리스트에 주소 URL을 넣고 

for 문으로 URL 체크를 한 뒤 파이썬 사전형에 키-값 으로

키: URL
값: HTTP 응답코드

를 넣어서 값이 404 인 것만 골라낼 수 있게 만들 수 있겠네요... ㅎㅎ





오늘은 파이썬으로 URL이 살아있는지 검사하는 방법에 대해 알아보았습니다.


그럼 다음 시간에 만나요~





기부 버튼을 만들었습니다
단지 $1 의 작은 정성도 저에게는 큰 힘이 됩니다
기부해주신 분들을 기억하며
더 좋은 내용으로 보답해 드리겠습니다 :)

Donate 버튼은 paypal 결제로 paypal 계정이 없으시더라도
카드로도 기부 가능하십니다 :)
Use your credit card or bank account (where available). 옆의 continue 를 누르시면 됩니다

한주현 드림



 



반응형

댓글