크롤링(Crawling)은 사전적 의미로는 기어다니는 것을 뜻한다.
웹에서 이 의미를 적용하면 웹 상을 돌아다니며 정보를 수집하는 것
이다.
다시 말하면, 문서나 API 등에서 데이터를 수집하고 사용자의 입맛에 맞춰
필요한 정보만 추출하여 처리하는 것을 이야기한다!
파이썬을 이용해서 진행을 하는데 총 2가지 라이브러리를 활용하였다.
1. html을 가져온다 - requests
2. 필요한 데이터를 걸러낸다 - bs4 (beautifulsoup4)
수업에서는 네이버 영화페이지에서 제목 가져오기를 진행했다!
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://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&tg=0&date=20211202',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)
위의 코드가 그 시작인데
하나씩 알아보면
headers
: 접속하는 사람/프로그램에 대한 정보
크롤링 할 때 서버에서 사용자를 봇으로 인지하여 정보를 주지 않고 '차단'하는 경우가 있습니다.
이때 headers정보에 User-Agent를 넣어주면 되는데,
http://www.useragentstring.com/
위 링크에서 복사해오면 된다!
data
: requests 라이브러리를 활용해 데이터를 가져올 url
과 headers 정보
를 준다.
title
: 변수를 하나 생성해준 뒤 bs4 라이브러리를 활용해서 html정보를 가져온다.
html정보를 가져올 때에는 html의 선택자 복사
기능을 이용한다!
위와 같이 복사를 해준 뒤 문자열 형태로 soup.slect_one()
의 인수로 넣어주면 된다.
<a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a>
그렇게 해주면 원하는 html코드를 가져올 수 있다.
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
선택자 복사를 통해서 서로 다른 두 제목 정보를 비교해보면
old_content > table > tbody > tr
까지 동일하고
그 후 숫자로 구분을 한 뒤
다시 td.title > div > a
부분이 동일한 것을 알 수 있다.
old_content > table > tbody > tr
은 영화칸까지 접근을 한 경로이고,
td.title > div > a
는 제목링크까지 접근한 것을 알 수 있다.
이 경로에서 제목 정보
를 얻을 수 있다!
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
if a is not None:
print(a.text)
movies
변수에 .select
를 통해 결과값을 '리스트 형태'로 저장해 준다.
그 후, .select_one
을 이용해서 하나씩 값을 가져온다.
.select_one
의 경우에는 속성값을 가져올 수 있기 때문에
.text
로 제목값만 가져온다!
(구분선으로 되어있는 부분은 None을 반환하기 때문에 예외처리를 해주었다.)
위에서 한 것에 추가로 순위와 평점 정보도 가져왔다.
이번에도 선택자 복사
기능을 이용하면 정말 편하게 할 수 있다!
for movie in movies:
a = movie.select_one('td.title > div > a')
if a is not None:
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
point = movie.select_one('td.point').text
print(rank,title,point)
DB(데이터 베이스)는 여러 사람이 공유하며 사용할 목적으로
체계화하여 통합, 관리를 하는 데이터의 집합
이다.
'데이터를 쉽게 뽑아쓰기 위해서!'가 간단하게 표현한 DB의 목적이라고 할 수 있다.
DB는 Index
라는 순서로 데이터들이 정렬되어있고 그것을 통해 쉽게 원하는 것들을
찾아낼 수 있다!
칸을 만들고 채워넣는 방식. 행-열이 있는 엑셀과 비슷함!
정형화
되어 있기 때문에 그만큼 데이터가 일관성
이 있고, 분석에 용이하다.
즉, 찾고 싶은 데이터도 보다 더 쉽게 찾을 수 있다.
그러나 많은 양의 데이터가 쌓여있는 상태에서 중간에 변화를 줄 때
유연하게 다루기가 어렵다.
ex) MS-SQL, My-SQL 등
딕셔너리 형태로 데이터를 저장.
들어오는 대로 쌓는 자유로운 형태이기 때문에 변화에 유연하게 대처가능
하다는 장점이 있다.
그래서 초기 스타트업과 같은 소규모 단위에서 주로 사용하는 방식이다.
하지만 그 반대로 데이터의 일관성이 부족하다는 단점이 있다!
ex) MongoDB
DB는 우리가 사용하는 프로그램
이다.
데이터를 잘 쌓고 관리하는 데에 용이한 프로그램이다!
따라서 사용하고 있는 컴퓨터에도 DB를 설치할 수 있는데
요즈음에는 클라우드환경을 많이 이용한다.
유저 트래픽이 몰리거나 / 백업이 필요하거나 / 모니터링을 해야 할 때 매우 용이하기 때문이다.
수업에서는 mongoDB를 클라우드에서 제공해주는 mongoDB Atlas
를 활용하였다!
mongoDB link:
https://www.mongodb.com/atlas/database
무료로 시작을 해준 뒤, 클라우드 지역설정과 클러스터의 이름을 설정해준다.
(myCluster
로 지어주었다!)
Connect
버튼을 눌러준 뒤
Connect your application
버튼을 누르고
보안설정으로 Username
과 Password
를 입력해주고
드라이버 설정을 해준다.
위 사진에서 보이는 코드를 복사해온 뒤
mongodb+srv://test:<password>@mycluster.aq6co.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
mongodb+srv://test:(설정한 패스워드)@mycluster.aq6co.mongodb.net/(클러스터명)?retryWrites=true&w=majority
위와 같이 변경을 해준다!
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:kassid@mycluster.aq6co.mongodb.net/myCluster?retryWrites=true&w=majority')
#db = client.(db명)
db = client.kassid
doc = {
'name' : 'kassid',
'age': 23
}
#db.(컬렉션명).insert_one(넣고싶은 자료)
db.admin.insert_one(doc)
Collections
를 확인해보면 데이터가 잘 들어와있는 것을 알 수 있다.