[mongoDB Atlas (2) 웹크롤링] 웹프로그래밍 A-Z 내일배움캠프 AI트랙

[mongoDB Atlas (2) 웹크롤링] 웹프로그래밍 A-Z 내일배움캠프 AI트랙

mongoDB Atlas에 데이터를 공유하기 이전에

먼저 데이터를 다듬는 작업이 필요하다.

python의 유용한 라이브러리 pip(python install package)를 가상환경(venv)에 설치함으로

웹의 정보를 공유하기 좋은 데이터로 만들어주는 웹크롤링 작업을 해보자.

01. 파이썬 패키지 설치(in PyCharm)

MAC user : PyCharm-Preference-Python Interpreter로 이동 후 '+'버튼 누른 뒤 패키지 설치

다양한 라이브러리가 있지만 아래와 같이 크게 4가지를 설치해보자.

Ajax와 같은 역할을 하는 requests

웹의 html을 불러와서 크롤링을 쉽게 할 수 있도록 도와주는 bs4(BeautifulSoup)

mongoDB Atlas 와 python을 연결해주는

pymongo, dnspython

여기서 잠깐, Ajax가 뭔지 기억이 안난다면 아래 글을 참고하자.

https://malang-e.tistory.com/4

02. 웹크롤링(requests, bs4 활용)

1) 라이브러리 기본 세팅

import requests # requests 라이브러리 사용한다는 명시 from bs4 import BeautifulSoup # bs4에서 BeautifulSoup을 가져와 사용한다는 명시 headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'} # 공백부분에 정보를 get하고자 하는 웹의 url 주소 입력 data = requests.get(' ',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') print(soup) # 출력값 입력한 url 주소의 html

2) 웹페이지의 선택자(selector)로 데이터 불러오기

Q. 선택자는 어떻게 찾을 수 있을까?

A. 웹페이지 마우스 오른쪽 클릭 '검사' - 원하는 태그에서 마우스 오른쪽 클릭 - copy - copy selector

# 선택자를 copy하면 상위태그와 하위태그로 구성되어 있음 soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') # 하나만 가져오고 싶을 때 soup.select_one(' ')

3) 데이터 가공하기(지니뮤직 웹사이트 크롤링 예제)

지니뮤직 url 을 가져옵니다.

https://www.genie.co.kr/chart/top200?ditc=M&rtm;=N&ymd;=20210701

기본세팅의 get 부분에 url을 입력합니다.

import requests from bs4 import BeautifulSoup headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'} data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm;=N&ymd;=20210701',headers=headers) soup = BeautifulSoup(data.text, 'html.parser')

웹크롤링의 목표는 아래 화면에서 순위, 곡제목, 아티스트명을 가져오는 것입니다.

해당되는 영역의 선택자를 copy하여 가져옵니다.

선택자를 분석해보니 상위, 하위태그가 반복적으로 사용되고 있습니다. 반복적으로 사용되는 tr부분을 trs로 묶고 반복문을 돌려줍니다.

'#body-content > div.newest-list > div > table > tbody > tr' # 반복적으로 사용되는 선택자

반복되지 않는 선택자를 select_one으로 지정하여 원하는 데이터(rank, title, artist)를 얻을 수 있습니다.

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr') for tr in trs: # trs를 다 돌면서 ' '라는 선택자를 포함하는 tr을 찾아서 정의 rank = tr.select_one('td.number').text[0:2].strip() title = tr.select_one('td.info > a.title.ellipsis').text.strip() artist = tr.select_one('td.info > a.artist.ellipsis').text print(rank, title, artist)

출력값

번외편

인덱싱(Indexing)과 슬라이싱(Slicing)

인덱싱: [인덱스번호] 로 특정위치의 문자 하나를 추출하는 것

슬라이싱: [start : stop : step] 으로 여러개의 문자를 추출하는 것

start는 추출하고자 하는 문자열 첫 문자의 index,

stop은 추출하고자 하는 문자열 마지막 문자의 index+1,

step은 증가폭으로 생략가능하며 기본값은 1

예)

text = 'ABCD'

text[0:2:1] 혹은 [0:2]

첫 문자 'A'의 index값 0 /

마지막 'B'의 index값 1+1 = 2 /

증가폭 기본값 1

= A,B 출력

rank = tr.select_one('td.number').text[0:2]

에서 text만 출력하였을 때

1 (공백) 1상승

으로 출력되기 때문에 text를 정돈해줄 필요가 있었음

text[0:2] 적용시 '1'만 출력 나머지는 공백처리됨

strip 함수(불필요한 내용 지워줌)

strip() 사용 시, ()을 비워두면 공백을 지운다는 의미

rank = tr.select_one('td.number').text[0:2].strip()

나머지 공백처리된 부분을 지워줌으로 rank 정리!

from http://malang-e.tistory.com/6 by ccl(A) rewrite - 2021-12-15 12:27:22