티스토리 뷰

이번 주차에서는 python 기초를 배우고,

그 기초를 이용해서 크롤링까지 배우게 된다. 

 

python은 javascript와 달리 변수를 선언할 때
var, let, const 이런 선언 없이 

a = 5 
b = 3

print(a + b)

 

라고 위와 같이 하게 되면 연산된 값으로 8이 쉽게 찍히게 된다.

 

 

문자열도 마찬가지로

a+b의 값은 changwooklee가 나온다.

a = 'changwook'
b = 'lee'

print(a + b)

이어서 리스트형식도 나오는데,

a_list = ['사과','배','감']

print(a_list[0])
a_list = ['사과','배','감']
a_list.append('포도')

print(a_list[3])

위와같이 0번째 형식을 출력하면 사과가 나오고 [ ] 안의 숫자 인덱스 값을 변경하면 다른값이 나오게된다.

값을 추가하는 경우에는 자바스크립트는 .push()였는데 파이썬은 .append() 이다.

append해서 추가한뒤 print 해보면 포도가 추가된걸 알 수 있었다.

 

이어서 딕셔너리 형식에 대해서도 나오는데

a_dict = {
	'name':'bob',
    	'age':27
}

print(a_dict['name'])

왜 {} 로 감싸는것일까 하는 의문이들어 인터넷에서 찾아보았다.

 

()는 보통 함수를 호출하거나 정의할 때 쓰고

[]는 index 를 활용하거나 리스트 자료형

{} 는 사전 자료형을 만들때 쓰임.

 

숙지해놔야겠다..!

 

어쨋든 print(a_dict['name']) 하게되면 당연히 bob이 출력된다.

나이를 출력하려면 print(a_dict['age'])

 

그리고 반복문을 실행할때 

자바스크립트는 for(int i = 0; i < 10; i++) {} 이런식으로 초기값을 설정해줘야했다면 

파이썬은

fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

for fruit in fruits:
	print(fruit)

for 지정이름 in 위에서만든배열변수이름: 

이렇게만 지정해서 print(지정이름)을 해주면

위에서만든배열변수이름에 해당하는 인덱스 값들이 출력되게 된다.

그리고 딕셔너리 형식에 if문을 대입한 예제가 나오게 되는데

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'])

위와 같이 20살보다 나이가 많은 사람들의 이름만 출력하는 형식으로 조건문을 줄 수 있었다.

결과는! 

carry와 ben.

 

이어서 크롤링에 대해서 배우게되는데

이 크롤링을 하기위해서는 패키지를 설치해야한다고 한다!

파이참에서는 설정 > 프로젝트: (해당프로젝트이름) > Python 인터프리터 >  + > requests 검색 후 패키지 설치

requests는 ajax 같은 역할을 하는 것이라고 했다! (html 가져오기)

+bs4 설치! (제목을 쉽게 찾게해주는 아이)

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')

print(soup)

 

 

이후 크롤링하려는 사이트에 들어가서 우클릭 > 검사 > 요소에서 > copy selector

위처럼 카피 셀렉터시  #old_content > table > tbody > tr:nth-child(2) > td.title > div > a가 복사가 되는데,

아래처럼 select_one() 괄호 안에 값을 넣게되면 

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')

print(title.text)

밥정이라는게 나온다!

전체 순위를 크롤링하려면 하나 하나 요소를 잡아보면

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a

#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 까지 동일한것을 알 수 있다.

 

아래 코드와같이 #old_content > table > tbody > tr를 select(#old_content > table > tbody > tr)로 movies에 할당해

for문을 돌려주고 a = movie.select_one('td.title > div > a') 나머지 요소를 넣고 비어있는 것들을 걸러서 

a.text 출력하면 된다!

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')

#old_content > table > tbody > tr:nth-child(2) > 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)

 

아래와 같이 결과는 출력된다.

크롤링 이후에 가공된 데이터를 데이터베이스에 저장을 하게되는데 

MongoDB를 사용하게된다.

https://account.mongodb.com/account/register

 

Cloud: MongoDB Cloud

 

account.mongodb.com

저 사이트에서 회원가입을 하고,

데이터베이스를 생성하게 된다(과정생략)

그리고 패키지를 설치해주면 되는데 

설치할 패키지는 pymongo, dnspython를 설치한다.

 

데이터베이스 생성후 위 사진의

cluster > Connect to Cluster()를  누른뒤 ②을 복사해서 아래 url 입력하는 란에 넣어주면 된다.

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

 

db에 값을 저장하는 예시는 아래와 같다.

처음에는 미숙하여 외어 치기보다는 필요한 기능을 찾아서 복붙하여 연습.

from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:tmvkfmxk@cluster0.0ei8mye.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'})

기존에 사용하던 크롤링 소스에서 아래 코드를 추가해주고

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

doc 라는 딕셔너리 형식으로

doc = {
    'title':title,
    'rank':rank,
    'point':point
}

아래 db.moviesprac.insert_one(doc) 저장하는 코드를 입력후 실행해주면 된다.

db.moviesprac.insert_one(doc)

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('url입력!')
db = client.dbsparta

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')

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:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        point = movie.select_one('td.point').text

        doc = {
            'title':title,
            'rank':rank,
            'point':point
        }

        db.moviesprac.insert_one(doc)

 

MongoDB에서 데이터 확인해보면!

아래와 같이 크롤링한 결과가 잘 저장되는걸 확인할 수 있다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함