상세 컨텐츠

본문 제목

파이썬 웹크롤링 기초 복습 (1)

본문

안녕하세요?
오늘은 구름 인공지능 교육에서 배운 파이썬 웹크롤링 & 텍스트 데이터 분석 활동을 복습해보는 시간을 갖도록 하겠습니다.

시작하기에 앞서, 먼저 단어의 뜻을 명확히 하고 가겠습니다.

우리가 흔히 사용하는 웹크롤링(Web crawling)에서 crawl이란
1.(엎드려)기다. 2.(곤충이)기어가다. 3.몹시 느리게 가다.
라는 뜻이 있고

본래의 Web Crawling이란 뜻은 Crawler라는 Bot이 거미줄 처럼 엉켜져있는 여러 web상의 link들을 타고다니며 돌아다니는 행위를 말하며
우리가 지금 흔히 webpage에서 원하는 자료를 긁어오는 행위는 web scraping이란 말이 맞습니다.
(하지만 지금은 흔히 웹스크래핑을 웹크롤링으로 부르고 있습니다.)

또 한가지 웹스크래핑을 배우기 앞서 HTML에 대해 아주 간단히 배우고 가겠습니다.

HTML이란 웹페이지의 뼈대가 되는 코드를 말합니다.
아래에 아주 HTML중에서도 아주 기본이 되는 것들만 한번 가져와봤습니다.

<html>
	<head>
		<title>제목</HTML>
	</head>
	<body>
		<h1>제목</h1>
		<p>단락</p>
		<div class=“클래스이름” id=“id값“> 
		<a href=“url”>링크</a>
			<div>
			</div>
		</div>
	</body>
</html>


보시면 아시겠지만 html로 시작해 -> 글의 머리가 되는 head부분을 작성해주고 -> 밑에 body들을 만들어줍니다. -> body안에는 div들로 여러개의 구역을 만들어 글을 쓸수도 있고 메뉴도 만드는 등 다양한 행위를 할 수 있습니다. -> 마지막으로 해왔던 순서들을 거꾸로 열어둔 태그들(head, body, div, h1, p…)을 닫아줍니다.
(웹페이지의 html구조를 확인해보고 싶다면 크롬 개발자모드를 사용하시면 됩니다. Ctrl + Shift + I)

여기서 HTML구조에서 저희가 자주 사용하게 될 것은 태그들의 class와 id 값들을 입니다.
class와 id가 해당 태그들을 인식하는데 도움을 주기 때문인데 이때 class는 여러 태그들이 같은 값을 동시에 사용할 수 있고, id는 여러 태그가 동시에 사용할 수 없음을 짚고 넘어갑시다. (나중에 가져오고자 하는 html의 구조에서 class와 id값이 같이 있으면 id값을 가져오는게 좋겠죠?)

이렇게 만들어진 html 코드들은 크롬과 같은 Web browser를 거쳐 Webpage & Website가 되는 것입니다.
(html -> web browser -> webpage)

그런데 이제 우리가 하고자하는 것은 이 html로 이루어져있는 webpage의 정보들을 파이썬으로 가져오고자 하는 것인데 이 과정은 파이썬 라이브러리인 BeautifulSoup4가 코드와 웹페이지의 중간다리 역할을 해줍니다.
(webpage -> beautifulsoup4 -> python)

요약 : html -> web browser -> webpage -> beautifulsoup4 -> python



이제 파이썬 코드내에서 뷰티풀숲을 활용한 웹스크래핑 과정에 대해 조금 더 자세한 과정을 설명한다면,

1. 웹크롤링을 하고자 하는 웹페이지의 url을 분석합니다. (패턴존재여부, query종류)
2. url 구성을 따와 HTTP의 Response를 얻습니다. -> HTTP Respeonse = urlopen(url), requset.get(url).content)
3. BeautifulSoup4로 webpage의 전체 HTML 구조를 가져오고 -> BeautifulSoup(HTTP Response, ‘html.parser’)
4. 크롤링을 원하는 부분의 HTML 태그를 찾고 (class&id)
5. 해당 태그를 꺼낸 다음 -> .find(‘Tag이름‘, {’Attr 이름‘ : ’Attr 값‘}) , .find_all(~~)
6. 태그 내부의 데이터만 뽑아냅니다. -> Tag.get_text() , Tag.attrs

* HTTP는 ‘Hypertext Transfer Protocol’의 약자로 웹을 이용하여 html로 작성된 hypertext 문서를 주고받을 수 있는 체계 정도로 생각하고 넘어가시면 됩니다.
* ‘html.parser’는 beutifulsoup이 웹페이지상의 html구조를 파싱하는 것인데 쉽게 ‘웹페이지 주소를 BS에 넘겨 html방식으로 해석해줘~’라고 생각하시면 됩니다.



다음으로 아주 간단한 실습 하나를 해보고 오늘 시간을 마무리 하도록 하겠습니다.

지금 해볼 것은 ‘다음 어학사전’ 페이지에서 ‘happiness’란 단어를 입력해서 나오는 한국어 뜻들을 스크래핑 해보겠습니다.

먼저 다음 어학사전의 url과 크롬개발자를 이용해 html를 분석해보면

다음사전 검색창에 happiness말고 다른단어를 입력하면 url에서 ‘q=~~’부분이 바뀌는 것을 확인할 수 있고
크롬개발자모드에서 인스펙터를 ‘행복’에 갖다대면 그에 해당하는 id가 나오고 그 위에 부모 class로 span class=‘txt_search’가 있는 것을 확인할 수 있습니다.
(그럼 여기서 아~ ‘txt_search’가 대충 단어의 뜻을 나타내는 class들이겠구나~라는 느낌이 오게 됩니다.)

이제 url과 html를 확인해보았으니 이제 다음사전에서 ‘happiness‘를 입력했을 때 나오는 창의 전체 html구조를 beautifulsoup을 통해 가져와보도록 하겠습니다.

!pip install beautifulsoup4==4.9.3

from urllib.request import urlopen 
from bs4 import BeautifulSoup  

# 검색하고 싶은 단어 입력하기
word = 'happiness'

# 불러오려는 url 입력하기 
# 디폴트 url에 string 타입의 word 변수를 합쳐서 url 변수 생성
url = 'https://alldic.daum.net/search.do?q=' + word

# urlopen 함수를 통해 web 변수를 생성
web = urlopen(url)   # urlopen(url).read().decode('utf-8')

# BeautifulSoup으로 web 페이지상의 HTML 구조를 파싱 (web주소를 BS에 넘겨 HTML방식으로 해석해줘~)
web_page = BeautifulSoup(web, 'html.parser')

print(web_page)


실제로 print되어진 html을 확인해보시면 엄청 긴 해당 페이지의 전체 html구조를 확인해볼 수 있습니다.

이제 html구조를 받아왔으니 저희가 찾고자하는 happiness의 뜻들을 가져와 보면 되는데요
그전에 지금은 웹스크래핑 첫 시간이니 만큼 파이썬으로 html의 태그들을 꺼내는 간단 코드들을 몇 개 더 잠깐 살펴보도록 하겠습니다.

여기서 하나 중요하게 보셨으면 하는점은 바로 web_page요소들의 데이터타입들입니다.
.find_all(‘p’)를 하면 html이 갖고있는 모든 p태그를 list형태로 가지고오는 것처럼 보이는데 이는 list타입이 아닌 tag타입임을 볼 수있습니다.
그냥 .find(‘p’)는 resultset타입으로 tag데이터타입 중 하나입니다.
web_page.find(‘p’).attrs 처럼 tag데이터타입일 때 추가적인 함수 적용이 가능한데 이때 get_text()와 같이 원하는 텍스트 데이터를 뽑아올 수도 있습니다.


이정도 까지만 확인해보고 이제는 happiness의 뜻들을 가지고 있는 태그들을 find_all로 모두 가져와보도록 하겠습니다.
아까 행복이란 뜻을 가지고있는 부모class의 이름이 txt_search였죠?

box2 = web_page.find_all(‘span’, {‘class’ : ‘txt_search’})
box2


보시면 이렇게 happiness의 뜻들에 해당하는 html들이 쫘르륵 펼쳐지는 것을 볼 수 있습니다.
이제 이것들을 get_text해서 문자들만 뽑아오면 되겠죠?

print(box1.get_text()) # get_ + Tab!
print()

for defintion in web_page.find_all('span', {'class': 'txt_search'}):
    print(defintion.get_text()) 



넵! 이렇게 해서 happiness에 해당되는 뜻들을 한번 쫘르륵 가져와보는 간단한 실습을 한번 해보았습니다.
전반적인 흐름을 보기위해 전체 코드를 밑에 게시해두고 오늘 글은 여기서 마무리하도록 하겠습니다.
감사합니다.!


!pip install beautifulsoup4==4.9.3 # 아나콘다에는 bs4가 미리 깔려있어서 굳이 안해도됩니다.

from urllib.request import urlopen 
from bs4 import BeautifulSoup  

# 검색하고 싶은 단어 입력하기
word = 'happiness'

# 불러오려는 url 입력하기 
# 디폴트 url에 string 타입의 word 변수를 합쳐서 url 변수 생성
url = 'https://alldic.daum.net/search.do?q=' + word

# urlopen 함수를 통해 web 변수를 생성
web = urlopen(url)   # urlopen(url).read().decode('utf-8')

# BeautifulSoup으로 web 페이지상의 HTML 구조를 파싱 (web주소를 BS에 넘겨 HTML방식으로 해석해줘~)
web_page = BeautifulSoup(web, 'html.parser')

box1 = web_page.find(‘span’, {‘class’ : ‘txt_emph1’})
print(box1.get_text()) # get_ + Tab!
print()

for defintion in web_page.find_all('span', {'class': 'txt_search'}):
    print(defintion.get_text()) 

관련글 더보기