💡 클롤링 : 웹피이지로 부터 데이터 추출하는 것.
✔ 크롤러 : 클롤링하는 소프트웨어

인터넷 브라우저(크롬, 익스플로어)로 네이버, 유투브를 봄.
주소를 명시하면 웹사이트에서 자기 웹사이트가 가진 텍스트덩어리를 던져줌.
-> 크롤링: 우리한테 필요한 것만 골라서 저장함
💡 웹 페이지를 만들기 위한 언어로 웹 브라우저에서 동작하는 언어입니다.
ex) 문서에 있는 데이터를 가져올때 '이름' 중요
<!DOCTYPE html>
<html> # 태그. 쌍을 이뤄서 구성
<head> #가장 큰 분류 1/ 문서의 대략적인 정보
<title> HTML 문서 </title>
</head>
<body> #가장 큰 분류 2 / 문서의 내용, 자체
<h1> 이것은 HTML 문서입니다! </h1>
</body>
</html>
복잡하게 이루어져 있다.
💡 아래는 네이버의 HTML 소스 코드 중 일부를 발췌했습니다.
ex)
<div class="direct_area"> #태그 라고 명칭
<a href="http://news.naver.com/" class="link_news" data-clk="newshome">네이버뉴스</a> #하이퍼링크를 걸게해주는 태그.a 태그만
<a href="http://entertain.naver.com/home" class="link_direct" data-clk="entertainment">연예</a>
<a href="http://sports.news.naver.com/" class="link_direct" data-clk="sports">스포츠</a>
</div>
태그란? :태그란 정보를 정의하는 형식을 말해요.
일반적인 태그의 형식 :
<태그명 속성명1="속성값1" 속성명2="속성값2"> 콘텐츠 </태그명>
: 태그는 콘텐츠를 감싸서 그 정보의 성격과 의미를 정의합니다.
ex) <div> ~ </div>
💡
선택자: 웹페이지에 어떤 구성요소의 주소
ex) 선택자가 없는 HTML
<html>
<head>
</head>
<body>
<h1> 장바구니
<p> 라운드티
<span> 25 </span>
<span> 29000 </span>
<span> 의류</span>
<a href = 'http://www.naver.com'> 이동 </a>
</p>
<p> 시계
<span> 28 </span>
<span> 32000 </span>
<span> 액세서리 </span>
<a href = 'http://www.facebook.com'> 이동 </a>
</p>
</h1>
</body>
</html>
💡 위 HTML 문서에 id와 class라는 '선택자'를 추가하면 훨씬 보기도 쉽고, 관리하기 쉬워집니다.
<html>
<head>
</head>
<body>
<h1> 장바구니
<p id='clothes' class='name' title='라운드티'> 라운드티
<span class = 'number'> 25 </span>
<span class = 'price'> 29000 </span>
<span class = 'menu'> 의류</span>
<a href = 'http://www.naver.com'> 바로가기 </a>
</p>
<p id='watch' class='name' title='시계'> 시계
<span class = 'number'> 28 </span>
<span class = 'price'> 32000 </span>
<span class = 'menu'> 액세서리 </span>
<a href = 'http://www.facebook.com'> 바로가기 </a>
</p>
</h1>
</body>
</html>
💡
패키지란 이미 만들져있는 함수들의 묶음입니다.
파이썬에서의 설치 !pip install 패키지이름
설치후 사용 from 패키지이름 import 모듈
모듈이란 패키지 안에 저장되어져 있는 함수 등
'임포트' 해서 쓴다.
사실 임포트도 여러가지 방법으로 할 수 있는데, 이는 차차 실습을 통해 이해하시게 될 거에요!
BeautifulSoup이 패키지를 통해 HTML이나 XML 문서로부터 원하는 정보를 추출할 수 있습니다. 🙂
!pip install beautifulSoup4 #colab에는 내장되어 있음.
# bs4라는 패키지로부터 BeautifulSoup라는 모듈을 임포트
from bs4 import BeautifulSoup
✔임포트는 딱 한번만 해도 된다.
ex) 웹스크리핑 예제 코드
# HTML 문서를 문자열 html로 저장
html = '''
<html>
<head>
</head>
<body>
<h1> 장바구니
<p id='clothes' class='name' title='라운드티'> 라운드티
<span class = 'number'> 25 </span>
<span class = 'price'> 29000 </span>
<span class = 'menu'> 의류</span>
<a href = 'http://www.naver.com'> 바로가기 </a>
</p>
<p id='watch' class='name' title='시계'> 시계
<span class = 'number'> 28 </span>
<span class = 'price'> 32000 </span>
<span class = 'menu'> 액세서리 </span>
<a href = 'http://www.facebook.com'> 바로가기 </a>
</p>
</h1>
</body>
</html>
'''
# BeautifulSoup 인스턴스 생성. 두번째 매개변수는 분석할 분석기(parser)의 종류.
soup = BeautifulSoup(html, 'html.parser')
- 첫번째 : 분석할 문서 이름, 문서가 저장되어 있는 변수의 이름
- 두번째 : 분석기 종류. (
html외 다양한 문서 분석하는 패키지인데 그 중html분석기로)
soup 이라는 변수에 저장.이렇게 인스턴스를 생성하고나면 본격적으로 정보를 가져오는 것은 select()를 가지고 수행합니다.
인스턴스의 이름은 soup이므로 soup.select()를 통해서 정보를 가져옵니다.
select()의 사용 방법은 요약하자면 soup.select('찾는 정보')입니다. 구체적인 예시는 다음과 같습니다.
soup.select('태그명'): 태그를 입력으로 사용할 경우soup.select('.클래스명'): 클래스를 입력으로 사용할 경우soup.select('#아이디'): ID를 입력으로 사용할 경우soup.select('상위태그명 하위태그명'): 자손 관계 (어떤 태그 내부에 있는 모든 태그를 자손이라고 함)soup.select('상위태그명 > 하위태그명'): 자식 관계 (어떤 태그 내부에 있는 태그 중 바로 한 단계 아래에 있는 태그를 자식이라고 함)
ex)실습을 통해 이해해볼까요? 태그명 를 입력으로 내부 정보를 가져와보겠습니다.
# <body> 태그를 입력
print(soup.select('body'))
[<p class="name" id="clothes" title="라운드티"> 라운드티
<span class="number"> 25 </span>
<span class="price"> 29000 </span>
<span class="menu"> 의류</span>
<a href="http://www.naver.com"> 바로가기 </a>
</p>, <p class="name" id="watch" title="시계"> 시계
<span class="number"> 28 </span>
<span class="price"> 32000 </span>
<span class="menu"> 액세서리 </span>
<a href="http://www.facebook.com"> 바로가기 </a>
</p>]
내부의 정보들을 모두 가져온 것을 확인할 수 있습니다. 이번에는 class가 menu인 경우만을 출력해보겠습니다.
print(soup.select('.menu'))
[<span class="menu"> 의류</span>, <span class="menu"> 액세서리 </span>]
이번에는 id가 watch인 경우만을 출력해보겠습니다.
print(soup.select('#watch'))
[<p class="name" id="watch" title="시계"> 시계
<span class="number"> 28 </span>
<span class="price"> 32000 </span>
<span class="menu"> 액세서리 </span>
<a href="http://www.facebook.com"> 바로가기 </a>
</p>]
이번에는 의도적으로 잘못된 입력을 넣어볼게요. 태그명 h1은 태그명 html의 자손이기는 하지만, 자식은 아닙니다. 만약, html 자식인 h1의 정보를 가져오라고 하면 어떻게 될까요?
print(soup.select('html > h1'))
->
[]
+) BeautifulSoup 보충설명