웹 크롤링 기초-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를 다룰 수 있어야 딥러닝도 잘 할 수 있는 법이다.

File rename 프로그램 제작

 목적

특정 폴더의 파일 이름을 일괄적으로 변경하기.
확장자를 입력하면 해당 확장자 파일을 모두 일련번호나 날짜가 붙은 파일로 변경함.
예를 들어,

dfsafdfa.png --> 0001.png
dagh2113.png --> 0002.png
kdkdkkdk.png ---> 0003.png

혹은

dfsafdfa.png --> 2021-01-23_0001.png
dagh2113.png --> 2021-01-23_0002.png
kdkdkkdk.png ---> 2021-01-23_0003.png

개발 노트

argparse 모듈을 써서 CLI(command line interpreter) 프로그램으로 작성함
progressbar 추가
pathlib으로 확장자 처리
glob으로 현재 경로에서 파일 리스트 추출
타입힌트 기능 사용


설치 및 사용

파이썬의 site-packages에 설치해 python -m 으로 사용합니다.
여러분은 아마 Anaconda를 설치했을 것입니다.
Anaconda Console을 실행하거나 맥 혹은 리눅스 사용자의 경우 터미널을 열어 봅니다.

다음과 같이 실행하여 jupyter console을 실행합니다.

jupyter console



파이썬의 모듈 경로를 확인합니다.

import sys
sys.path


맨 뒤가 site-packages로 끝나는 경로에 주목합니다. 해당 경로에 파이썬 모듈(즉 py로 끝나는 파일)을 넣어 두면 손쉽게 python -m 옵션으로 이를 실행하는 CLI 프로그램이 됩니다.

위 깃 허브 링크에서 다운로드 받은 pyrename.py 파일을 site-packages 폴더에 넣습니다.

이제 특정 경로에 저장된 이미지 파일의 이름을 임의로 변경합시다. 콘솔이나 터미널을 열어서 작업합니다.
콘솔에서 디렉토리를 바꾸려면 cd 경로이름 이렇게 합니다.

팁: 윈도의 사용자는 우선 파일 익스플로러 상단의 주소를 ctrl+c로 복사하고 터미널에서 cd 뒤에 커서를 위치시킨 뒤 마우스 우클릭을 합니다. 경로가 바로 붙습니다.

팁: 맥 사용자는 Finder에서 "편집"으로 간 다음 옵션키를 누르면 경로 복사하기가 보입니다.

Dowloads 폴더의 enw 파일 이름을 한 번에 변경해보겠습니다. 터미널을 열어



cd /Users/tagg/Downloads
python -m pyrename --help


--help를 보니 -e 와 -dt 옵션에 관한 설명이 있습니다.

이제 실행 합시다.

python -m pyrename -e enw -dt

enw로 끝나는 확장자를 모두 바꾸고, 날짜 옵션(dt)를 켰습니다.



이상 파이썬 모듈을 설치하여 사용하는 방법을 살펴봤습니다.
CLI 프로그램에 관심이 있는 사람은 깃허브 소스코드를 다운로드 받아 살펴보시면 좋겠네요.


웹 크롤링 기초-셀레니움selenium, 크롬웹드라이버 설치, HTML


 안녕하세요 오늘은 판다스 기초에 이어서 웹 크롤링 기초를 공부해보려고 합니다.

이번 글에서는 셀레니움 설치, 크롬웹드라이버 설치와 HTML 에 대해 간략하게 배워볼 예정이고

다음 글에서는 BeautifulSoup 라이브러리를 활용한 HTML 정보 찾기에 대해 다뤄보려고 합니다.




저번에 판다스를 다룰 때에는 파이참에서 interpreter 로 아나콘다를 사용했었는데요

지금도 미숙하지만 당시에는 더 많은 것을 몰라서 판다스를 사용하기 위해서는 아나콘다를 필수적으로 사용해야한다고 생각해 아나콘다를 사용했습니다만

이런 저런 예제를 다루면서 기존 파이참 파이썬 interpreter 로도 판다스 사용이 가능하다는 것을 알게되었습니다. 

그래서 오늘은 아나콘다가 아닌 파이참 파이썬을 사용할 예정입니다. 나중에 아나콘다에 대해 더 공부해서 정리해보는 시간을 가져야 할 것 같습니다...ㅠㅠ 


파일, 디렉토리를 복사하고 삭제하는 방법

 파이썬에서 파일을 복사하거나 삭제하려면 os와 shutil 모듈을 사용합니다.


import os

import shutil


파일을 복사할 때는 


shutil.copfyfile("원본 파일","대상 파일")


이렇게 하면 됩니다.

폴더를 복사하려면


shutil.copytree("원본 폴더명","대상 폴더명")


간단하죠?


파일을 삭제하려면


os.remove("파일 이름")


폴더를 삭제하려면


shutil.rmtree("폴더 이름")


참고로 os.remove()와 shutil.rmtree()의 결과는 되돌릴 수 없습니다. 신중하길!

PyR Intro - 신입생OT학기제