어떤 웹 사이트를 크롤링하던지 에러를 만나지 않을 수가 없다. 이럴 때 당황하지 않고 어떻게 처리해야하는지 궁금해져서 책을 구매했다.. ㅋㅋㅋㅋ 🤣. 앞으로 파이썬으로 웹 크롤러 만들기(2판)과 함께 종종 웹 크롤링 포스팅을 해보려고 한다.
우리가 웹 크롤링을 할 때, 자주 접할 수 있는 눈물 흘리고픈 😢 상황들이 몇가지 있다. 특히 크롤링하라고 코드를 돌려놓고 자고 일어났을 때 만나는 상황들이다 ㅋㅋㅋ..
이런 상황에서 우리는 에러를 만나게되며 절망에 빠지게 된다 😈. 어떻게 예외처리를 해야하는지 알아보자 😁.
아래의 코드에서 문제가 생길 수 있는 경우가 두 가지이다.
html = urlopen('http://www.pythonscraping.com/pages/page1.html')
첫 번째 상황에서 HTTPError 가 발생한다. HTTP 에러는 "404 Page Not Found"
, "500 Internal Server Error"
등 이다.
from urllib.request import urlopen
from urllib.error import HTTPError
try:
html = urlopen('http://www.pythonscraping.com/pages/page1.html')
except HTTPError as e:
print(e)
# null, break 등의 방법 사용
else:
# 프로그램 계속 실행
두 번째 상황에서 http://www.pythonscraping.com 이 다운됐거나 URL애 오타가 있으면 URLError 를 일으킨다.
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
try:
html = urlopen('http://www.pythonscraping.com/pages/page1.html')
except HTTPError as e:
print(e)
except URLError as e:
print('The server could not be found!')
else:
print('It worked!')
다음 코드에서 nonExistentTag 는 None 객체를 반환한다.
print(bs.nonExistentTag)
그럼에도 불구하고 다른 것을 호출한다면 다음과 같은 에러가 발생한다.
print(bs.nonExistentTag.someTag)
AttributeError: 'NoneType' object has no attribute 'someTag'
이럴 때는 다음과 같은 코드를 사용해 볼 수 있다.
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
def getTitle(url):
try:
html = urlopen(url)
except HTTPError as e:
return None
try:
bs = BeautifulSoup(html.read(), 'html.parser')
title = bs.body.h1
except AttributeError as e:
return None
title = getTitle('http://www.pythonscraping.com/pages/page1.html')
if title == None:
print('Title could not be found')
else:
print(title)
스크랩퍼를 만들 때, 코드의 전반적인 패턴에 대해 생각해야하고, 예외도 처리해야 하고, 읽고도 쉽게 만들어야하고, 재사용도 가능하게 해야한다. 넘나 어려운 일이지만, 미리 예외처리를 만들어 두어야 나머지 기능에 집중할 수 있을 거라고 생각한다!!