크롤링을 하다보면 페이지나 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' 카테고리의 다른 글
[웹크롤링] Twitter API를 이용해 Twitter에 글 남기기 (0) | 2020.08.24 |
---|---|
[웹크롤링] Twitter API Key 발급 받기 (0) | 2020.08.15 |
[웹크롤링] 미국 하의원의 홈페이지 링크 저장하기 (0) | 2020.08.10 |