# Jupyter Notebook 주요 단축키
* Enter: 일반 모드에서 편집 모드로 전환
* ESC: 편집 모드에서 일반 모드로 전환

 

* ▶︎일반 모드 단축키
  * A: 선택된 셀 위에 새로운 셀 추가
  * B: 선택된 셀 아래에 새로운 셀 추가
  * X: 선택된 셀 잘라내기
  * C: 선택된 셀 복사
  * V: 선택된 셀 아래에 붙여넣기
  * D, D: 선택된 셀 삭제
  * Z: 셀 삭제 취소

* ▶︎편집 모드 단축키
  * Ctrl + Z: 되돌리기
  * Ctrl + Y: 되돌리기 취소
  * Ctrl + A: 셀 내용 전체 선택
  * Ctrl + Home: 셀 맨 위로 이동
  * Ctrl + End : 셀 맨 아래로 이동
  * Ctrl + D: 현재 줄 삭제
  * Tab: 자동 완성 기능 사용

 

1. 셀레니움

  • 셀레니움은 브라우저를 컨트롤 할 수 있도록 지원하는 라이브러리

 

# 셀레니움 설치

# window
!pip install selenium

# mac
!pip3 install selenium

 

# 크롬 드라이버 설치

# window
!pip install chromedriver_autoinstaller

# mac
!pip3 install chromedriver_autoinstaller
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() #창 띄우기
driver.get('http://www.google.com') #구글이동
search = driver.find_element('name', 'q') # find_element: 태그에서 하나 찾기 :name에서 q만 찾기
search.send_keys('날씨') # 검색창에 날씨 입력
search.send_keys(Keys.RETURN) # 검색

 

 

2. 네이버 웹툰

네이버웹툰 베스트댓글과 전체댓글 크롤링하기

  • https://comic.naver.com/webtoon/detail?titleId=641253&no=471&week=fri
driver = webdriver.Chrome() #창 띄우기
driver.get('https://comic.naver.com/webtoon/detail?titleId=641253&no=471&week=fri') # 네이버 웹툰으로 이동
!pip3 install bs4

 

# 베스트 댓글 크롤링하기

from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_source)
comment_area = soup.findAll('span', {'class':'u_cbox_contents'})
print(comment_area)
print('********베스트 댓글*****************')
for i in range(len(comment_area)):
    comment = comment_area[i].text.strip() # 텍스트만 뽑고 공백삭제
    print(comment)
    print('-' * 30)

 

 

# 전체댓글 크롤링하기

 

  • Xpath: 기존의 컴퓨터 파일 시스템에서 사용하는 경로 표현식과 유사한 경로 언어
  • Copy full Xpath
  • 크롤링을 원하는 위치를 클릭후 우클릭으로 개발자모드(F12/option+control+I) -> Copy -> Copy full Xpath로 경로복사
  • /html/body/div[1]/div[5]/div/div/div[5]/div[1]/div[3]/div/div/div[4]/div[1]/div/ul/li[2]/a/span[2]
driver.find_element('xpath','/html/body/div[1]/div[5]/div/div/div[5]/div[1]/div[3]/div/div/div[4]/div[1]/div/ul/li[2]/a/span[2]').click
soup = BeautifulSoup(driver.page_source)

commentall_area = soup.findAll('span', {'class':'u_cbox_contents'})
print(commentall_area)
print('********전체 댓글*****************')
for i in range(len(commentall_area)):
    comment = commentall_area[i].text.strip() # 텍스트만 뽑고 공백삭제
    print(comment)
    print('-' * 30)

'컴퓨터 비전 > 웹 서비스' 카테고리의 다른 글

FastAPI  (0) 2023.12.16
Streamlit  (2) 2023.12.03
픽사베이  (1) 2023.12.03
인스타그램  (1) 2023.12.03
크롤링(Crawling)  (0) 2023.12.02

1. 데이터

데이터(data)는 정보나 사실들의 원시적이고 구조화되지 않은 형태입니다. 이것은 숫자, 문자, 이미지, 소리 등 다양한 형태로 나타날 수 있습니다. 예를 들면, 온도 측정 결과, 사진, 글, 음성 녹음 파일 등이 데이터에 해당합니다.

 

2. 데이터베이스

데이터베이스(database)는 관련된 데이터를 체계적으로 저장하고, 관리하고, 검색할 수 있도록 설계된 전자적 시스템입니다.

간단히 말하면, 데이터베이스는 "정보의 보관소"와 같습니다. 데이터베이스를 사용하면 크거나 작은 양의 데이터를 안전하게 저장하고 필요할 때 쉽게 찾아낼 수 있습니다.

 

 

3. 데이터베이스 관리 시스템

DBMS는 데이터베이스 관리 시스템(Database Management System)의 약자입니다. DBMS는 데이터베이스를 생성하고, 유지하고, 조작하기 위한 소프트웨어 도구의 집합입니다. 일반적으로 DBMS는 두 가지 유형으로 나뉩니다.

 

RDBMS (관계형 데이터베이스 관리 시스템): 데이터를 테이블 형태로 저장하며, 테이블 간의 관계를 정의할 수 있는 시스템입니다. 예로는 Oracle, MySQL, Microsoft SQL Server, PostgreSQL 등이 있습니다.

NoSQL DBMS: 관계형 모델을 사용하지 않는 데이터베이스 시스템으로, 큰 데이터 량이나 유동적인 데이터 구조를 지원하기 위해 설계되었습니다. 예로는 MongoDB, Cassandra, Redis 등이 있습니다.

 

 

4. MongoDB

MongoDB(몽고디비)는 NoSQL 데이터베이스 시스템 중 하나로, 문서 지향(document-oriented) 데이터베이스입니다. 이는 관계형 데이터베이스와는 다르게 데이터를 테이블이 아니라 JSON 스타일의 BSON(Binary JSON) 형식의 문서로 저장합니다. MongoDB는 개발자가 유연하게 데이터를 저장하고 쿼리할 수 있도록 하는 목적으로 만들어진 것이며, 대규모의 분산 데이터베이스 환경에서도 잘 동작합니다.

 

문서 지향 데이터베이스: MongoDB는 데이터를 BSON 형식의 문서로 저장합니다. 이 문서는 키-값 쌍(key-value pairs)으로 이루어져 있으며, 여러 종류의 데이터 유형을 포함할 수 있습니다.

스키마 없음 (Schema-less): 관계형 데이터베이스와 달리 MongoDB는 데이터베이스의 스키마를 명시적으로 정의하지 않습니다. 이는 동적인 스키마를 사용하여 데이터 모델을 유연하게 변경할 수 있도록 합니다.

유연한 데이터 모델: MongoDB는 다양한 데이터 형식을 지원하며, 중첩된 문서와 배열을 허용하여 복잡한 데이터 구조를 표현할 수 있습니다.

분산 데이터베이스: MongoDB는 여러 서버에 데이터를 분산하여 저장하고 처리할 수 있는 분산 데이터베이스 시스템을 지원합니다.

5. MongoDB Cloud

MongoDB Cloud는 MongoDB 데이터베이스를 클라우드 환경에서 제공하는 서비스입니다. MongoDB Cloud는 MongoDB, Inc.가 제공하는 공식 클라우드 서비스로서, MongoDB를 쉽게 관리하고 배포할 수 있도록 도와줍니다. 이 서비스는 데이터베이스 클러스터를 호스팅하고 관리하며, 사용자는 몽고DB 클라우드를 통해 데이터베이스를 쉽게 설정하고 확장할 수 있습니다.

클라우드 접속

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

MongoDB Shell 다운로드

https://www.mongodb.com/try/download/shell

MongoDB Shell 다운 후 Mogosh 에서 실습

 

데이터베이스 확인

show databases

 

데이터베이스 생성

use aiproject

 

컬렉션 생성

db.createCollection("user")

 

컬렉션 확인

show collections

 

데이터 추가

db.user.insert({userid: "apple", name: "김사과", age: 20})

 

데이터 조회

db.user.find() 

​

db.user.find({"userid":"apple"})

 

데이터 수정

db.user.update({userid: "apple"}, {$set: {age: 25}})

 

 

데이터 삭제

db.remove.remove({userid:"apple"})

 

 

데이터베이스 확인방법

상단메뉴 Data Services -> Overview왼쪽메뉴에서 Database선택 후 -> Browse Collections 클릭

 
 

 

 

데이터 확인


Colab 실습

 

  • pymongo 설치
!pip install pymongo

 

from pymongo import MongoClient


url = "mongodb+srv://<나의 아이디>:<나의 비밀번호>.mongodb.net/?retryWrites=true&w=majority"
client = MongoClient(url)
print(client)
database = client['aiproject']
collection = database['user']
user_insert = {"userid" : "Fubao", "name" : "푸바오", "age": 3}
result = collection.insert_one(user_insert)
print(f'입력된 데이터 ID{result.inserted_id}

output

더보기

>> 입력된 데이터 ID655decc05ec49026ad1c476f

 

# 데이터 조회

# 데이터 조회
user_find = {"userid" :"Fubao"}
result = collection.find_one(user_find)
print(f'데이터:{result}')

output

더보기

데이터:{'_id': ObjectId('655decc05ec49026ad1c476f'), 'userid': 'Fubao', 'name': '푸바오', 'age': 3}

 

# 데이터 수정

# 데이터 수정
user_update = {"userid":"Fubao"}
new_value = {"$set":{"age":31}}
collection.update_one(user_update, new_value)
print('데이터 변경 성공')

output

더보기

데이터 변경 성공

 

# 데이터 삭제

# 데이터 삭제
user_delete = {"userid":"Fubao"}
collection.delete_one(user_delete)
print("데이터 삭제 성공")

output

더보기

데이터 삭제 성공

 

'컴퓨터 비전 > DBMS' 카테고리의 다른 글

파이참에서 aws, MySQL 연결하기  (0) 2024.01.19
MySQL  (0) 2024.01.18

1. 크롤링과 스크레이핑

- 크롤링(Crawling) : 인터넷의 데이터를 확용하기 위해 인터넷의 정보들을 수집하는 행위

- 스크레이핑(Scraping): 크롤링 + 데이터를 추출하고 가공하는 행위

 

2. Basig English Speaking

import requests
from bs4 import BeautifulSoup

site = 'https://basicenglishspeaking.com/daily-english-conversation-topics/'
request = requests.get(site) # 리퀘스트를 get방식으로 접속
print(request) #[200] 정상적인 접속

output

더보기

<Response [200]>  #정상적인 접속

print(request.text) #가져온 html 확인
soup = BeautifulSoup(request.text)

# div의 딱 한부분만 가져옴
divs = soup.find('div', {'class':'thrv-columns'})
print(divs)

# div안에 있는 앵커('a')태그만 찾기
links = divs.findAll('a')
print(links)

# 리스트이기 때문에 for문으로 돌면서 텍스트만 찍기
# 앵커태그 안에 있는 텍스트만 가져오기
for link in links:
    print(link.text)

output

더보기

Family
Restaurant
Books
...
Handcraft Items
Plastic Surgery
Success

 

subject = []

for link in links: # (links)에서 앵커태그를 하나씩 링크(link)로 뽑아 빈 리스트에 텍스트가 하나씩 들어감
    subject.append(link.text)
len(subject)

output

print('총', len(subject), '개의 주제를 찾았습니다.')
for i in range(len(subject)):
    print('{0:2d}, {1:s}'.format(i+1, subject[i]))

 

output

더보기

총 75 개의 주제를 찾았습니다.
1. Family
2. Restaurant
3. Books
...
73. Handcraft Items
74. Plastic Surgery
75. Success

3. 다음 뉴스기사

# 제목을 뽑아보는 크롤링

 

크롤링할 기사
#https://v.daum.net/v/20231124152902275

def daum_news_title(news_id):
    url = 'https://v.daum.net/v/{}'.format(news_id)
    request = requests.get(url)
    soup = BeautifulSoup(request.text)
    title = soup.find('h3', {'class':'tit_view'}) # class안 tit_view 찾기

    if title:
        return title.text.strip()
    return '제목없음'

 

 

daum_news_title('20231124152902275')

output

더보기

' 김유정 "이상이와 1년간 매일같이 보고 있어, 어색할까 걱정" (\'마이 데몬\') '

daum_news_title('20231124144808698')

output

더보기

'한효주, 美에미상 빛냈다..'큰칼' 잊게 만든 우아美+유창한 영어 [종합]'

 

 

 

 

 

 

4. 벅스 뮤직차트

벅스차트
# https://music.bugs.co.kr/chart


request = requests.get('https://music.bugs.co.kr/chart')
soup = BeautifulSoup(request.text)

titles = soup.findAll('p', {'class':'title'}) # findAll : 선택한 항목의 모든요소 찾기
#print(titles)
artists = soup.findAll('p',{'class':'artist'})
#print(artists)

for i, (t, a) in enumerate(zip(titles, artists)):
    title = t.text.strip().replace('[19금]\n', '') # replace -> 19금 -> ''변경
    artist = a.text.strip().split('\n')[0] # 스플릿으로 문자열을 나눈 후 공백을 삭제후 첫번째 요소만 출력
    print('{0:3d}위 {1} - {2}'.format(i+1, artist, title))

 

# enumerate :  반복문을 사용할 때 인덱스와 값을 함께 가져오기 위해 사용되는 내장 함수
# zip 함수 :  zip() 함수는 파이썬에서 여러 개의 반복 가능한(iterable) 객체를 병렬적으로 묶어주는 내장 함수

 

output

더보기

1위 ATEEZ(에이티즈) - 미친 폼 (Crazy Form)
2위 태연 (TAEYEON) - To. X
3위 LE SSERAFIM (르세라핌) - Perfect Night
...
98위 탑현 - 나에게 그대만이
99위 케이시 - 사실말야내가말야그게그러니까말이야
100위 KISS OF LIFE - Sugarcoat (NATTY Solo)

 

 

 

 

5. 멜론차트

  • robots.txt : 웹 사이트에 크롤러같은 로봇들의 접근을 제어하기 위한 규약 (권고안이라 꼭 지킬 의무는 없음) (https://www.melon.com/robots.txt)
멜론차트
#https://www.melon.com/chart/index.htm

request = requests.get('https://www.melon.com/chart/index.html')
print(request)
output
<Response [406]> #406번은 정보를 가져오지 못한 것

 

titles = soup.findAll('div class',{'class' : 'title'})
print(titles)
ouput
[] 

 

 

 

이럴땐 User-Agent가 필요

User-Agent

# User-Agent
# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'}
request = requests.get('https://www.melon.com/chart/index.html',headers=header)
print(request)
output
<Response [200]>

 

 

titles = soup.findAll('div',{'class':'rank01'})
#print(titles)
artists = soup.findAll('span',{'class':'checkEllipsis'})
#print(artists)

for i, (t, a) in enumerate(zip(titles, artists)):
    title = t.text.strip().replace('19금\n','')#split('\n')
    artist = a.text.strip()
    print('{0:3d}위 {1} - {2}'.format(i+1, artist, title))
output
1위 LE SSERAFIM (르세라핌) - Perfect Night
2위 aespa - Drama
3위 IVE (아이브) - Baddie
...
98위 최유리 - 숲
99위 케이시 (Kassy) - 사실말야내가말야그게그러니까말이야
100위 BE'O (비오) - 미쳐버리겠다 (MAD)

 

 

 

 

6. 네이버증권

 
# 이름, 가격, 종목코드, 거래량
# 그린리소스, (가격 : 52,300, 종목코드 : 402490, 거래량 : 34,192,513))
# {'name':'그린리소스, 'price':52300, code: '402490', 'volume': 34192513}

 

request = requests.get('https://finance.naver.com/item/main.naver?code=402490')
soup = BeautifulSoup(request.text)

# 이름
div_totalinfo = soup.find('div', {'class':'new_totalinfo'})
name = div_totalinfo.find('h2').text

# 가격
div_today = div_totalinfo.find('div', {'class':'today'})
em = div_today.find('em')
price = div_today.find('span',{'class':'blind'}).text

# 종목코드
div_code = div_totalinfo.find('div', {'class':'description'})
code = div_code.find('span',{'class':'code'}).text

# 거래량
table_no_info = soup.find('table',{'class','no_info'})
tds = table_no_info.findAll('td')
volume = tds[2].find('span',{'class':'blind'}).text

# 딕셔너리
dic = {'name': name, 'code':code, 'price':price, 'volume':volume}
print(dic)

 

 

네이버증권 종목코드로 정보추출하는 함수

 

def naver_finance(code):
    # 코드
    site = f'https://finance.naver.com/item/main.naver?code={code}'
    request = requests.get(site)
    soup = BeautifulSoup(request.text)

    # 이름
    div_totalinfo = soup.find('div', {'class':'new_totalinfo'})
    name = div_totalinfo.find('h2').text

    # 가격
    div_today = div_totalinfo.find('div', {'class':'today'})
    em = div_today.find('em')
    price = em.find('span', {'class':'blind'}).text

    # 거래량
    table_no_info = soup.find('table', {'class':'no_info'})
    tds = table_no_info.findAll('td')
    volume = tds[2].find('span', {'class':'blind'}).text

    dic = {'name':name, 'code':code, 'price':price, 'volume':volume}
    return dic

 

naver_finance('252670')
output
{'name': 'KODEX 200선물인버스2X',
'code': '252670',
'price': '2,580',
volume': '79,577,748'}

 

naver_finance('032790')
output
{'name': '엠젠솔루션',
'code': '032790',
'price': '1,928',
'volume': '692,851'}

 

codes = ['017040', '007980', '352090', '402490', '032790']
data = []
for code in codes:
    dic = naver_finance(code)
    data.append(dic)
print(data)
output
[{'name': '광명전기', 'code': '017040', 'price': '2,430', 'volume': '757,418'}, {'name': '태평양물산', 'code': '007980', 'price': '2,985', 'volume': '3,630,259'}, {'name': '스톰테크', 'code': '352090', 'price': '12,510', 'volume': '803,272'}, {'name': '그린리소스', 'code': '402490', 'price': '34,750', 'volume': '1,371,371'}, {'name': '엠젠솔루션', 'code': '032790', 'price': '1,928', 'volume': '692,851'}]

 

 

 

# 데이터프레임 생성

# pandas: 데이터를 2차원으로 바꿔주는 기능

import pandas as pd
df = pd.DataFrame(data)
df
output

 

# 자료를 엑셀로 변환

df.to_excel('naver_finace.xlsx') # 자료 -> 엑셀 변환

 

 

 

 

# 지니뮤직
# https://www.genie.co.kr/
# ...
# import time을 이용
# time.sleep(3)
# 지니차트 1 ~ 200위까지 크롤링해서 엑셀로 만들기
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup

# 상위 200위까지 출력
data = []
for j in range(1, 5):  # 페이지는 1에서 4까지
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
    request = requests.get(f'https://www.genie.co.kr/chart/top200?ditc=D&ymd=20231124&hh=21&rtm=Y&pg={j}', headers=header)
    soup = BeautifulSoup(request.text)

    table = soup.find('table', {'class': 'list-wrap'})
    titles = table.findAll('a', {'class': 'title ellipsis'})
    artist = table.findAll('a', {'class': 'artist ellipsis'})
    number = soup.findAll('td', {'class': 'number'})

    for i, (n, t, a) in enumerate(zip(number, titles, artist)):
        numbers = n.text.strip().split('\n')[0]
        titles = t.text.strip().replace('19금', '').lstrip()  # 19금 아이콘 제거
        artists = a.text.strip()
        dic =('{0}위 {1} - {2}'.format(numbers, artists, titles))
        data.append(dic)
    time.sleep(2)

 

df = pd.DataFrame(data)
df

 

output

 

 

df.to_excel('지니.xlsx')
지니.xlsx 파일

 

 

 

'컴퓨터 비전 > 웹 서비스' 카테고리의 다른 글

FastAPI  (0) 2023.12.16
Streamlit  (2) 2023.12.03
픽사베이  (1) 2023.12.03
인스타그램  (1) 2023.12.03
셀레니움  (0) 2023.12.02