웹개발공부 (w.스파르타코딩클럽 / 3주차)-1

Kassid·2021년 12월 4일
1

web

목록 보기
3/5
post-thumbnail

웹 스크래핑(크롤링)

크롤링(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 라이브러리를 활용해 데이터를 가져올 urlheaders 정보를 준다.

  • 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의 목적이라고 할 수 있다.

DB는 Index라는 순서로 데이터들이 정렬되어있고 그것을 통해 쉽게 원하는 것들을
찾아낼 수 있다!

종류

1. SQL

칸을 만들고 채워넣는 방식. 행-열이 있는 엑셀과 비슷함!
정형화 되어 있기 때문에 그만큼 데이터가 일관성이 있고, 분석에 용이하다.
즉, 찾고 싶은 데이터도 보다 더 쉽게 찾을 수 있다.

그러나 많은 양의 데이터가 쌓여있는 상태에서 중간에 변화를 줄 때
유연하게 다루기가 어렵다.
ex) MS-SQL, My-SQL 등

2. NoSQL(Not only SQL)

딕셔너리 형태로 데이터를 저장.
들어오는 대로 쌓는 자유로운 형태이기 때문에 변화에 유연하게 대처가능하다는 장점이 있다.
그래서 초기 스타트업과 같은 소규모 단위에서 주로 사용하는 방식이다.

하지만 그 반대로 데이터의 일관성이 부족하다는 단점이 있다!
ex) MongoDB

DB의 실체

DB는 우리가 사용하는 프로그램이다.
데이터를 잘 쌓고 관리하는 데에 용이한 프로그램이다!
따라서 사용하고 있는 컴퓨터에도 DB를 설치할 수 있는데

요즈음에는 클라우드환경을 많이 이용한다.
유저 트래픽이 몰리거나 / 백업이 필요하거나 / 모니터링을 해야 할 때 매우 용이하기 때문이다.

수업에서는 mongoDB를 클라우드에서 제공해주는 mongoDB Atlas를 활용하였다!


mongoDB Atlsas 튜토리얼

mongoDB link:
https://www.mongodb.com/atlas/database

무료로 시작을 해준 뒤, 클라우드 지역설정과 클러스터의 이름을 설정해준다.
(myCluster로 지어주었다!)

그 후에 잠시 기다려주면 위와 같이 생성완료!

Connect버튼을 눌러준 뒤

Connect your application버튼을 누르고
보안설정으로 UsernamePassword를 입력해주고

드라이버 설정을 해준다.

위 사진에서 보이는 코드를 복사해온 뒤

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를 확인해보면 데이터가 잘 들어와있는 것을 알 수 있다.

profile
🌊푸르지만 뜨겁게🔥

0개의 댓글