웹 개발/웹개발종합

웹 개발 기초5 - 크롤링 (웹 스크래핑), mongoDB 연결하기

개발자명백 2023. 3. 3. 17:12

0. 파이썬 설치

파이썬 (윈도우) 다운 : https://www.python.org/ftp/python/3.8.6/python-3.8.6-amd64.exe 

파이썬 (맥) 다운 : https://www.python.org/ftp/python/3.8.2/python-3.8.2-macosx10.9.pkg 

gitbash 다운 : https://git-scm.com/ 

 

Add Pythoon 3.8 to PATH를 반드시 체크한 후 설치를 진행합니다. 

 

 

1. 파이썬 기초 - 변수, 자료형, 함수, 조건문, 반복문

파이썬의 변수는 자바스크립트와 마찬가지로 자료형을 적지 않습니다. 

a = 2
b = 3
print(a + b)

c = 'choi'
d = 'myb'
print(c + d)

 

출력 결과 : 

5
choimyb

 

파이썬의 자료형은 자바스크립트와 마찬가지로 리스트와 딕셔너리가 있습니다. 리스트의 경우 append 함수를 통해 값을 추가할 수 있습니다. 딕셔너리는 키와 값 쌍을 이룹니다. 

a_list = ['사과', '배', '감']
a_list.append('수박')
print(a_list)

a_dict = {'name': 'bob', 'age': 27}
print(a_dict['age'])
['사과', '배', '감', '수박']
27

 

파이썬의 함수는 def 키워드로 시작합니다. 또한 함수의 바디는 들여쓰기로 구분됩니다.

def sum(a, b):
    return a + b
print(sum(2, 8))

def is_adult(age):
    if age > 20:
        print('성인')
    else:
        print('청소년')
is_adult(15)
10
청소년

 

파이썬의 반복문은 in 키워드를 제공합니다. 주어진 반복 가능한 자료형의 모든 요소를 탐색할 수 있습니다. 

cnt = 0
fruits = ['사과', '배', '배', '감', '수박', '귤', '딸기', '사과', '배', '수박']
for fruit in fruits:
    if fruit == '사과':
        cnt += 1
print(cnt)

people = [{'name': 'bob', 'age': 20},
          {'name': 'carry', 'age': 38},
          {'name': 'john', 'age': 7},
          {'name': 'smith', 'age': 17},
          {'name': 'ben', 'age': 27}]
for person in people:
    if person['age'] > 20 :
        print(person['name'])
2
carry
ben

 

 

2. 패키지 설치하기

가상환경이란? Virtual Environment, venv는 파이썬의 라이브러리, 패키지를 독립적으로 관리합니다. 다른 파이썬 응용 프로그램의 동작에 영향을 주지 않도록 파이썬 배포 패키지를 설치하거나 업데이트 할 수 있는 격리된 실행환경입니다. 

 

패키지 설치하기 :

- (파이참) 파일 -> 설정 -> 프로젝트 : 프로젝트명 -> Python 인터프리터 -> (+) 버튼 클릭 -> requests 검색 후 패키지 설치

- pip이란? python install package의 약자이며 파이썬 프로젝트의 라이브럴를 가상환경에 설치합니다. 

 

requests 패키지는 JS에서 ajax가 수행했던 것처럼 GET 요청 기능을 수행합니다. 아래와 같은 문법으로 날씨 데이터를 요청해 가져올 수 있습니다. 

import requests # requests 라이브러리 설치 필요

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

rows = rjson['RealtimeCityAir']['row']

for row in rows:
    gu_name = row['MSRSTE_NM']
    gu_mise = row['IDEX_MVL']
    if gu_mise < 60:
        print(gu_name)

 

 

3. 크롤링

크롤링하기 : requests를 활용해 해당 페이지를 요청하기 -> bs4를 활용해 해당 페이지의 특정 데이터 추출하기

헤더 추가하기 : 웹 서버측에서 크롤러를 로봇의 부적절한 접근으로 인식하는 경우 헤더에 User Agent 정보를 기입해 ㅏ치 브라우저가 요청하는 것처럼 요청을 합니다. 

User Agent란*  
HTTP 통신 시 브라우저가 웹서버에 연결을 시작할 때 전달되는 정보로 OS, 브라우저, 브라우저가 사용하는 플랫폼 등의 다양한 정보를 담고 있습니다. 예를 들어, 아이패드에서 사파리를 사용하면 다음과 같은 내용으로 적용되는 것을 확인할 수 있습니다. Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405

User Agent는 옆의 링크에 접속해서 복사해 코드에 활용할 수 있습니다. (http://www.useragentstring.com/)

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&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

# 단일 셀렉터 크롤링
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a') # copy selector
print(title, title.text, title['href'], sep='\n') # 태그, 텍스트, 속성 가져오기

# 다중 셀렉터 크롤링
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)

 

 

4. 크롤링 연습하기

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&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
    if movie.select_one('td.title > div > a') is not None:
        rank = movie.select_one('td.ac > img')['alt']
        title = movie.select_one('td.title > div > a').text
        point = movie.select_one('td.point').text
        print(rank, title, point)

출력결과 : 

01 밥정 9.64
02 그린 북 9.59
03 가버나움 9.59
04 디지몬 어드벤처 라스트 에볼루션 : 인연 9.53
05 원더 9.52
06 베일리 어게인 9.52
07 먼 훗날 우리 9.52
08 아일라 9.51
09 당갈 9.49
010 극장판 바이올렛 에버가든 9.48
11 포드 V 페라리 9.48
12 주전장 9.47
13 쇼생크 탈출 9.45
14 터미네이터 2:오리지널 9.44
15 덕구 9.43
16 나 홀로 집에 9.43
17 라이언 일병 구하기 9.43
18 클래식 9.42
19 잭 스나이더의 저스티스 리그 9.42
20 그대, 고맙소 : 김호중 생애 첫 팬미팅 무비 9.42
21 월-E 9.42
22 보헤미안 랩소디 9.42
23 사운드 오브 뮤직 9.41
24 포레스트 검프 9.41
25 빽 투 더 퓨쳐 9.41
26 위대한 쇼맨 9.41
27 글래디에이터 9.41
28 헬프 9.41
29 인생은 아름다워 9.40
30 타이타닉 9.40
31 매트릭스 9.40
32 살인의 추억 9.40
33 센과 치히로의 행방불명 9.39
34 토이 스토리 3 9.39
35 가나의 혼인잔치: 언약 9.39
36 헌터 킬러 9.39
37 캐스트 어웨이 9.38
38 집으로... 9.38
39 아이즈 온 미 : 더 무비 9.38
40 반지의 제왕: 왕의 귀환 9.38
41 죽은 시인의 사회 9.38
42 히든 피겨스 9.38
43 알라딘 9.38
44 어벤져스: 엔드게임 9.38
45 레옹 9.38
46 쉰들러 리스트 9.37
47 아이 캔 스피크 9.37
48 동주 9.37
49 안녕 베일리 9.37
50 클레멘타인 9.37

종료 코드 0(으)로 완료된 프로세스

 

 

5. DB 개괄

DB란? 데이터를 저장하고 가져오기위한 프로그램입니다. 

DB를 쓰는 목적 : 데이터를 저장하는 것 뿐만 아니라 필요한 정보를 쉽게 찾기 위해서입니다. DB는 Index 순서대로 데이터 들이 정렬되어 있습니다. 인덱스를 통해 데이터베이스 테이블의 검색 속도를 향상시킵니다. 단 인덱스는 작은 크기의 테이블에서 높은 효율을 가집니다. 

 

DB의 종류 : SQL, NoSQL 

SQL : 정형화, 무결성, 높은 속도, 큰 규모/ 낮은 유연성 <->  NoSQL (Not Only SQL)  

클라우드 DB : 많은 장점 - 백업, 모니터링, 대규모처리 (mongoDB Atlas)

 

 

6. mongoDB 가입 및 인스턴스 생성

- Shared-> 클러스터 선택 및 생성

- Network Access 에서 current IP 추가

- DataBase Access 에서 database user 추가 

- 파이참 pip 에서 pymongo, dnspython 패키지 설치

- db connect 에서 connect your application 클릭 -> python 버전 맞춘 후 내용 복사해서 username과 password 바꾼 후  MongoClient 함수에 복사 붙여넣기

- db browse collection 에서 입력된 값을 볼 수 있음

from pymongo import MongoClient
client = MongoClient('mongodb+srv://<username>:<password>@cluster0.klkai.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta


# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

# 조회하기 - 파이썬 코드
for user in all_users:
    print(user['name'], user['age'])

 

 

7. 메타태그 활용해 크롤링 하기

import requests
from bs4 import BeautifulSoup

url = 'https://movie.naver.com/movie/bi/mi/basic.naver?code=191597'

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(url,headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

og_image = soup.select_one('meta[property="og:image"]')['content']
og_title = soup.select_one('meta[property="og:title"]')['content']
og_description = soup.select_one('meta[property="og:description"]')['content']