웹 크롤링 기초-BeautifulSoup을 이용한 정보 찾기

 


안녕하세요 저번 글에 이어서 이번 글에서는 BeautifulSoup을 이용한 HTML정보 찾기를 공부해보려고 합니다. 

저는 이래저래 이 부분을 총 3번 공부했는데요, 두번째 공부할때에도 이해가 잘 안되더라구요.. 그래서 이해가 어느정도 될 때까지 책에 나온 예제들을 공부하면서 실습하고 다시 공부해보았습니다. (오늘 잘 설명을 할 수 있을지..걱정이..ㅠ 책도 이해가 좀 힘들게 나와있더라구요..) 

즉 바로 이해가 안될 수 있지만!! 하다보면 익숙해지면서 언젠가 이해가 될 수 있어요..!



(1) BeautifulSoup 라이브러리 불러오기


저번 글에서 했던 "html 다운로드"에 이어서 작성해주면 됩니다.
from bs4 import BeautifulSoup 을 해주면 되는데요
만약 설치가 안되어 있어 오류가 뜬다면 bs4 패키지를 설치해주시면 됩니다.

앞서 내려받은 html은 여러 문자들이 연결된 문자열 데이터입니다.
이를 BeautifulSoup이라는 라이브러리를 통해 html 변수에 있는 정보를 HTML 형식에 맞게
해석해서 원하는 정보를 찾을 수 있습니다.

! 여기서 B 와 S를 반드시 대문자로 써주세요 !




(2) HTML 정보 찾기 - 태그 속성 활용

BeautifulSoup 명령어 select('조건')을 이용하면 HTML내에서 입력한 조건을 만족하는 태그를 모두 선택할 수 있습니다.

저는 직접 이 글을 보는 분들이 바로 실습을 할 수 있도록 저번 글에서도 사용했던
네이버 홈페이지를 이용해 실습 해보겠습니다.
(책에서는 실제 html이 아닌 저자가 직접 만든 html 글을 가지고 예제를 만들었는데요, 직접 돌려볼 수 없어서 이해가 더 힘들더라구요. 그래서 이번 글에서는 실제 네이버 홈페이지 html 을 이용해보겠습니다.)

이번 장에서 이론?을 위주로 보시고 다음 글에서 멜론 웹페이지로 실습을 해보다보면 더 적용이 잘 될거예요.




예제2-1. 태그명으로 태그찾기


select('조건')을 이용한 예제들인데요 조건에 태그명을 입력한 경우입니다.
첫번째로는 soup에 담긴 HTML페이지에서 태그명이 'span'인 태그를 모두 찾아 tags_span변수에 저장했고, 두번째로는 태그명이 'p'인 태그를 모두 찾아 tags_p 변수에 저장했습니다.

저는 tags_span을 출력해보았는데요, 실제로 네이버 홈페이지에서 태그명이 'span'인 정보들이 출력된것을 확인할 수 있습니다. 



예제2-2. id와 class로 태그 찾기


이번에는 아이디값을 이용해 태그 정보를 찾아보려고합니다.
위의 경우 id 값이 "header" 인 태그를 모두 찾아 ids_header에 저장한 뒤 ids_header을 출력한 모습입니다. (제가 네이버 홈페이지 html을 보고 임의로 정한 값입니다. 큰의미x)

id값을 select()안 조건으로 사용할때에는 '#'을 사용해주면 됩니다.








이번에는 class명을 사용해 태그 정보를 뽑는 방법입니다. id값 앞에 '#'를 붙혔다면 class의 경우에는 '.'을 붙혀주면 됩니다. 

위의 경우 '.opt_item'을 이용해보았는데요, 이 경우 class 명이 'opt_item'인 태그들을 찾을 수 있습니다. ('opt_item' 또한 제가 네이버 웹페이지 html을 보고 임의로 선택한 class정보입니다.)

그리고 class명 조건을 태그명과 함께 지정할 수도 있습니다. 'span.opt_item'의 형식으로 사용하면 되는데요, 이는 태그명이 'span'이면서 class 명이 'opt_item'인 태그를 조건으로 지정하는 것입니다. 




(3) HTML 정보 찾기 - 상위 구조 활용

앞서 (2)에서는 태그 속성을 활용하여 정보를 찾았다면 (3)에서는 구조를 활용한 정보찾기를 해 볼 예정입니다.


예제 3-1. 태그 구조로 위치 찾기 1



(2)의 예제2-2는 네이버 홈페이지 html에서 span.opt_item 태그를 찾아보았는데요, 이번엔 그 태그의 상위구조를 이용해 특정 정보만을 찾아보는 것을 연습해보려고합니다.

(2)의 예제 2-2에서 찾은 span.opt_item 태그는 총 5개인데요, 'span.side_opt_area' 라는 상위태그를 이용하면 3개의 태그만을 골라낼 수 있습니다. 출력이 안된 나머지 2개의 태그는 span이라는 태그명과 opt_item이라는 class명을 가지고 있지만 상위태그가 span.side_opt_area 가 아니기 때문에 출력이 되지 않은 것입니다.

이렇게 바로 위의 상위 태그를 입력할때는 '>' 를 사용합니다.

상위구조를 보는 방법은 실제 html 에서 ctrl +F 를 이용해 찾을 수도 있고, [검사]기능을 이용해 찾을수도 있으며 'copy selector'을 통해서도 찾을 수 있습니다. 이 부분은 오늘 글 아래에서 추가해놓겠습니다.*

(위 사진에서 selector 코드는 span.opt_item 태그 중 첫번째 태그의 셀렉터 코드입니다.)



예제 3-2. 태그 구조로 위치 찾기 2



예제 3-1처럼 바로 위의 상위태그를 이용하는 것이 아닌 몇 단계 위의 상위태그를 이용하는 방법도 있습니다.

바로 위의 상위태그를 이용할 때는 주로 '>' 를 사용하지만 몇 단계 위의 상위태그를 이용할 때에는 띄어쓰기를 사용합니다. '>'를 쓰게 되면 실행 완료가 되지 않더라구요. (파이썬 툴마다 차이가 있을 수 있습니다.)



Numpy - Code Score 01

Source: https://github.com/drtagkim/Lab/blob/master/Education/ScoreNumpy/ScoreNumpy01.ipynb

Numpy Code Score 01

파이썬이 데이터 과학 도구가 될 수 있었던 이유? 바로 Numpy가 있기 때문이다. Numerical Python, 줄여서 np는 강력한 벡터 연산 도구이다.

여러분을 위해 33개의 코드 스코어를 준비했다. 코딩의 최고 연습법은 악보를 연주하듯 코드를 암기하여 반복적으로 적어보는 것이다. 노트 프로그램이면 뭐든 괜찮다. 손으로 해도 된다. 이제부터 33개 numpy 코드 악보를 익혀보자. 오늘은 첫 시간이다.

import numpy as np
# 배열 만들기, 입력값을 list로 주는 경우
a=np.array([1,2,3])
print("What type? ",type(a))
print("What shape? ",a.shape)
print("Values of 1st and 2nd? ",a[0],a[1])
a[0]=5
print("New value of 1st?", a)

  • import numpy as np #numpy를 np라는 이름으로 불러온다.
  • np.array() #벡터 배열 혹은 텐서(tensor)를 만든다.
  • type(a) #객체의 타입을 반환한다.
  • a.shape #텐서의 차원 형태를 반환한다.
  • a[0], a[1] #차원 값을 읽어온다.
  • a[0]=5 #대입한다.
직접 입력해서 결과를 확인하자. Google Colab에 들어가서 코드를 실행하며 결과를 관찰하기를 바란다. 

자, 위의 코드를 모두 외워서 메모장에 재현해보자. 할 수 있을 때까지 암기하고 반복하면 된다.

텐서?

자료를 차원(dimension)으로 묶어 정리하면 텐서가 된다. 예를 들어, 1반의 학생이 3명, 2반의 학생이 3명이 있다고 하자. 그리고 우리는 각 학생의 점수를 알고 있다. 이제 점수를 차원으로 묶어 텐서로 표현하자.

반의 구분이 없는 경우(점수=1차원), 텐서는 [100,90,80,40,50,60] 이렇게 6개의 점수로 된 1차원의 배열(array)이다. N차원의 배열을 ndarray 라고 한다. 

반의 구분이 있는 경우(반=1차원, 점수=2차원), 2차원 텐서가 되어 [1반=[100,90,80],2반=[40,50,60]], 줄여서 [[100,90,80],[40,50,60]]이 된다. 텐서는 차원을 더하면 더 늘어난다. 또한 차원을 제거하면 줄어든다.

텐서를 늘여보자. 남자/여자 차원을 추가한다. 이제 텐서는 (반=1차원, 성별=2차원, 점수=3차원)의 3차원 텐서가 된다. 즉, [[[100,90],[80]],[[40],[50,60]]] 이 된다. 앞쪽이 여자, 뒷쪽이 남자다.

여러분은 텐서플로(Tensorflow)를 들어봤을 것이다. 이때의 텐서가 바로 차원을 가진 자료의 뜻이다. 텐서는 물리학에도 나온다. 크게 보면 같은 개념이다. 텐서의 특징은 차원의 변화가 관점에 따라 자유롭다는 것이다. 위의 예에서 우리는 얼마든지 텐서를 3차원에서 1차원까지 자유롭게 바꿀 수 있다. 이러한 자료의 변화되는 흐름(flow)에 따라 딥러닝을 해나가는 패키지가 바로 구글의 텐서플로다.

Numpy는 텐서를 다룰 수 있도록 하는 파이썬의 패키지다. 텐서는 딥러닝을 위한 텐서플로나 케라스, PyTorch의 기본이다. 따라서 Numpy를 다룰 수 있어야 딥러닝도 잘 할 수 있는 법이다.

PyR Intro - 신입생OT학기제