서론

어떤 웹 사이트를 크롤링하던지 에러를 만나지 않을 수가 없다. 이럴 때 당황하지 않고 어떻게 처리해야하는지 궁금해져서 책을 구매했다.. ㅋㅋㅋㅋ 🤣. 앞으로 파이썬으로 웹 크롤러 만들기(2판)과 함께 종종 웹 크롤링 포스팅을 해보려고 한다.

신뢰할 수 있는 연결과 예외처리

우리가 웹 크롤링을 할 때, 자주 접할 수 있는 눈물 흘리고픈 😢 상황들이 몇가지 있다. 특히 크롤링하라고 코드를 돌려놓고 자고 일어났을 때 만나는 상황들이다 ㅋㅋㅋ..

  1. 웹사이트가 잠시 다운됨
  2. 있어야할 태그가 없음
  3. 데이터 형식이 엉망진창임

이런 상황에서 우리는 에러를 만나게되며 절망에 빠지게 된다 😈. 어떻게 예외처리를 해야하는지 알아보자 😁.

문제가 나올 수 있는 부분

아래의 코드에서 문제가 생길 수 있는 경우가 두 가지이다.

html = urlopen('http://www.pythonscraping.com/pages/page1.html')
  1. 페이지를 찾을 수 없거나, URL 해석에서 에러가 생긴 경우
  2. 서버를 찾을 수 없는 경우

1

첫 번째 상황에서 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:
    # 프로그램 계속 실행

2

두 번째 상황에서 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!')

None 객체 참조 예외

다음 코드에서 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)

결론

스크랩퍼를 만들 때, 코드의 전반적인 패턴에 대해 생각해야하고, 예외도 처리해야 하고, 읽고도 쉽게 만들어야하고, 재사용도 가능하게 해야한다. 넘나 어려운 일이지만, 미리 예외처리를 만들어 두어야 나머지 기능에 집중할 수 있을 거라고 생각한다!!

profile
뭐든지 열심히하는 타입 😎

0개의 댓글