파이썬 urllib패키지로 웹크롤링 하는 방법 알아보기!

2021. 8. 16. 16:57

파이썬을 하면서 재미있는 작업 중의 하나는 웹크롤링이다. 웹에는 여러가지 데이터가 풍부한데 이를 매일 수작업으로 수집하는 것은 곤욕스러운 일이다. 자동으로 페이지 정보를 수집해서 분석할 수 있는 일은 재미있다. 데이터 분석을 하고 싶어도 데이터가 없다고 하는 마당이니 더욱 그렇다.

오늘은 파이썬 urllib패키지를 이용해서 웹크롤링 하는 방법에 대해서 알아보도록 하겠다.

 

파이썬 웹크롤링

 

 

기존 소스를 보고 웹크롤링을 하는 것은 쉽다. 물론 약간의 html지식이 필요하기는 하다. html은 하이퍼 텍스트 마크업 랭귀지의 약자로 태그로 이루어진 코드를 말한다. 여기서는 절차를 쉽게 외우고 태그에서 정보를 추출하는 가장 쉬운 방법을 알아보고자 한다.


웹크롤링을 하는 방법은 이렇다.


1. 크롤링 하고자 하는 웹싸이트의 문을 연다. 데이터를 가져와야 하기 때문에 가져오고자 하는 곳의 문을 연다고 생각하면 좋을 듯 하다. 해당 웹싸이트에서 문을 열어주지 않으면 데이터를 수집할 수 없다. 좀 더 깊게는 소켓 통신을 연결한다고 생각하면 된다.

2. 웹페이지 소스를 가져온다. 문을 열고 나서는 데이터를 가져와야 한다. 이 때 필요한 정보만 가져오는 것은 안 된다. 일단 전체 소스를 다 가져오고 여기서 필요한 부분만 발췌해야 한다.

3. 필요한 데이터만 찾는다. html의 태그 정보를 이용해서 필요한 텍스트만 가져온다. 필요한 곳의 텍스트만 가져오기 위해서 beautifulsoup이라는 패키지를 이용한다. html은 태그로 글이 이루어져 있기 때문에, 특정 태그를 지정해서 원하는 정보를 가져올 수 있다. beautifulsoup에 대한 자세한 내용은 다음 포스팅에서 한 번 알아보도록 하겠다.

 


이 때 xpath를 사용하면 좋은데 beautifuloup에서는 xpath를 사용할 수 없다. xpath는 html태그의 주소라고 보면 되겠다. 이 주소를 이용하면 자신이 원하는 곳의 태그 정보를 정확히 가져올 수 있다. xpath를 사용하려면 셀레니움을 이용해야 한다. 셀레니움으로 xpath를 이용하는 방법은 다음 포스팅에서 알아보도록 하겠다.

 

 

셀레니움

 

 

이를 코드로 보면 아래와 같다.
크롤링 하는 싸이트는 '모두를 위한 파이썬'에 나오는 크롤링 연습 싸이트를 대상으로 해 보았다. 모두를 위한 파이썬이 궁금하다면 아래 포스팅을 참조하기 바란다.
( 참조: 파이썬 튜토리얼보다 쉽고 재미있는 파이썬 무료 기초 교육 추천! )

 


1. 문을 연다.
문을 열 때는, url을 입력인자로 넣고 urlopen함수를 호출한다.

from urllib.request import urlopen
 
url = "http://www.dr-chuck.com/"
result = urlopen(url)

 

 

2. 웹페이지 소스를 가져온다.
read함수를 호출하면 웹페이지 소스, html을 가져올 수 있다.

result_html = result.read()

 

3. 필요한 부분을 가져온다.
필요한 정보를 가져오기 위해 beautifulsoup 모듈을 이용한다. 모듈을 import하고 html로 파싱한다. find_all함수는 지정한 태그를 모두 찾아서 반환하는 함수이다. a태그는 링크를 지정할 때 사용하는 태그이다. 아래와 같이 실행하면 a태그를 사용한 html코드를 모두 찾아서 반환해준다. beautifulsoup에 대해서는 다음에 자세히 알아보도록 하겠다.

from bs4 import BeautifulSoup
 
result_soup = BeautifulSoup(result_html, 'html.parser')
a = result_soup.find_all('a')

 

 

오늘은 이렇게 urllib패키지를 이용한 웹크롤링 프로세스 및 필요 정보를 추출하는 방법에 대해서 알아보았다. 누군가가 자신이 원하는 정보를 수집해 준다는 것은 좋은 일이다. 그것도 사람이 아니라 기계가 하기 때문에 원하는만큼 마음대로 시킬 수 있다. beautifulsoup에서 xpath도 지원해주면 좋겠지만, 현재는 불가능하다. 이후에 버전업이 되면 가능할 수도 있지 않을까 한다.

댓글()