zenn.skin 무료버전 배포중!
자세히보기

Python/Web Scraping

[웹크롤링] HTTPError, AttributeError, URLError

koosco! 2020. 8. 19. 23:17

크롤링을 하다보면 페이지나 url이 존재하지 않거나 서버가 존재하지 않는 상황이 많이 생긴다. 이때 미리 예외처리를 해놓지 않으면 오랜 시간 프로그램을 돌리고 원하는 결과를 얻지 못할 수 있다.

 

다음과 같은 문제가 발생할 수 있다. 1) 페이지를 찾지 못하는 경우와 2) 태그가 없는 경우, 3) 서버를 찾지 못하는 경우이다.

 

1) HTTPError

HTTPError는 서버에 접속은 성공했으나 해당 페이지를 찾지 못할 때 발생한다

from urllib.request import urlopen
from urllib.request import HTTPError
from bs4 import BeautifulSoup

try:
	page = urlopen('https://koosco.tistory.com/error.html')
except HTTPError as e:
	print(e)

위 코드를 실행하면 다음과 같이 에러를 출력해준다. 해당 문서가 존재하지 않으므로 404 Not Found 에러가 발생하게 된다

 

2) AttributeError

BeautifulSoup 객체를 생성하고 객체의 태그에 접근할 때도 에러가 발생할 수 있다.

객체는 정상적으로 생성되었지만 만약 유효하지 않은 태그에 접근하면 AttributeError를 반환한다

 

from urllib.request import urlopen
from urllib.request import HTTPError
from bs4 import BeautifulSoup

page = 'https://koosco.tistory.com'
page_obj = BeautifulSoup(page, 'html.parser')
print(page_obj.nonExistingTag.a)

nonExistingTag는 존재하지 않는 태크이다. BeautifulSoup는 태그가 존재하지 않을 경우 None을 반환한다

None은 당장 사용되기 전까지는 아무런 문제를 일으키지 않는다

하지만 반환받은 None에 a 태그는 존재하지 않으므로 이 때 AttributeError가 발생하게 된다

 

 

HTTPError와 마찬가지로 미리 태그가 존재하는지 확인을 하는 예외처리를 해주어야 한다

try:
    content = bsObj.nonExistingTag.a
except AttributeError:
    print('Tag was not found')

다음처럼 태그가 존재하지 않는 경우를 예외처리해줄 수 있다

 

3) URLError

URLError는 서버가 존재하지 않거나 서버가 다운되었을 경우 반환되는 에러이다. 서버에 접속했다면 HTTPError를 반환할텐데 아예 서버에 접속하지 못하는 경우 반환한다

보통 서버가 다운되었거나 url에 오타가 있을 때 발생하게 된다

이런 경우 URLError 이외에도 TimeError, ValueError가 번갈아 가며 발생하는 경우가 많은데 이 경우에 대해서는 좀 더 공부가 필요할 것 같다. 보통 위의 두 에러가 많이 발생하게 된다.

'Python/Web Scraping'의 다른글

  • 현재글 [웹크롤링] HTTPError, AttributeError, URLError

관련글