티스토리 뷰
이번 주차에서는 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에서 데이터 확인해보면!
아래와 같이 크롤링한 결과가 잘 저장되는걸 확인할 수 있다.

'개발 > 항해99' 카테고리의 다른 글
| Git 시작하기 가이드. (0) | 2022.09.07 |
|---|---|
| 항해99 (웹개발 종합반 5주차) (0) | 2022.09.05 |
| 항해99 (웹개발 종합반 4주차) (0) | 2022.09.04 |
| 항해99 (웹개발 종합반 2주차) (0) | 2022.09.03 |
| 항해99 시작 (웹개발 종합반 1주차) (0) | 2022.09.02 |
- Total
- Today
- Yesterday
- JPQL
- 풀텍스트
- ajax
- Spring
- wil
- EC2
- JWT토큰
- 코드해석
- instance
- .jks
- 환경세팅
- POI
- joinfetch
- IOC
- 항해99
- this
- java
- badrequest
- python
- querydsl
- JPA
- EntitiyManagerFactory
- DTO
- backoffice
- 협업
- ssl
- DI
- 알고리즘
- method
- 김영한
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |