1. print()

  • print() 함수는 파이썬의 기본 출력 함수로, 터미널이나 콘솔 창에 텍스트나 데이터를 출력하기 위해 사용
print('Hello', 'Python')

print('Hello', 'Python', 'Hi', 'Python')

print('Hello', end='.....')
print('Python')

print('Hello', end = ' ')
print('Python')

print('Hello', end='❤ ')
print('Python')
더보기

Hello Python

Hello Python Hi Python

Hello.....Python

Hello Python

Hello❤ Python

 

 

 

2. 파이썬의 escape 문자

  • 파이썬에서 이스케이프 문자는 문자열 안에서 특별한 의미를 가지는 문자들을 나타내기 위해 사용됩니다. 이스케이프 문자는 백슬래시()로 시작하며, 문자열 내에서 특정한 동작이나 특수 문자를 표현하기 위해 사용됩니다.

\n 줄 바꿈
\t 탭 출력
\\ 백 슬래시 표시
\"  or  \'  큰 따옴표, 작은 따옴표 표시 (문자열을 감싸는 따옴표와 구분하기 위해 사용)
\r 캐리지 리턴 표시 (문자열 출력 후 커서를 줄의 처음으로 이동)
\b 문자열 내에서 한 글자 삭제

 

 

print("Hello\nPython")
print("Name\t푸바오")
print("푸바오는 죽순이 맛있어 : \\")
print("푸바오. \"훅!\"")
더보기

Hello

Python

Name                푸바오

푸바오는 죽순이 맛있어 : \

푸바오. "훅!"

 

3. print 함수내의 연산

  • print() 함수는 문자열뿐만 아니라 숫자와 연산 결과도 출력할 수 있습니다.
print("덧셈 :", 10 + 3)
print("뺄셈 :", 10 - 3)
print("곱셈 :", 10 * 3)
print("나눗셈 :", 10 / 3)
print("정수 나눗셈 :", 10 // 3)
print("나머지 :", 10 % 3)
print("거듭제곱 :", 10 ** 3)
더보기

덧셈 : 13

뺄셈 : 7

곱셈 : 30

나눗셈 : 3.3333333333333335

정수 나눗셈 : 3

나머지 : 1

거듭제곱 : 1000

print(10 + 5)
print(10 - 5)
print(10 * 5)
print(10 / 5)
print('10 + 5')
#print('10' + 5) #TypeError: can only concatenate str (not "int") to str
더보기

15

5

50

2.0

10 + 5

 

4.주석문

  • 파이썬 주석은 코드 내에 프로그래머가 작성한 설명이나 메모를 포함하는데 사용됩니다. 주석은 코드를 이해하고 다른 개발자와 협업하는 데 도움이 되며, 코드의 기능과 목적을 명확하게 설명할 수 있습니다. 주석은 프로그램 실행 중에 무시되므로 코드 실행에 영향을 미치지 않습니다.

 

print('파이썬 출력하기') # 문자열 출력은 작은따옴표 '' 또는 큰따옴표 ""를 사용함
더보기

파이썬 출력하기

 

'''
이것은 여러 줄 주석입니다.
여러 줄 주석은 큰따옴표 세 개 또는 작은따옴표 세 개 사이에 작성됩니다.
여러 줄에 걸쳐 설명을 적을 수 있습니다.
'''
print('파이썬 출력하기')
더보기

파이썬 출력하기

5. 출력서식 지정

  • 파이썬의 print() 함수는 출력 서식을 지정하여 값을 형식화하고 출력하는 기능을 제공합니다. 서식 지정자와 함께 사용되는 % 연산자와 format() 메서드를 사용하여 원하는 형식으로 출력할 수 있습니다.
print('정수 : %d' %100)
print(f'정수 : {100}')
print('정수 : %d' %100.5)
print('실수 : %f' %100.5)
print('실수 : %f' %100)
print('문자열: %s' % 'Python')
print('문자열: %s' % 100)
더보기

정수 : 100

정수 : 100

정수 : 100

실수 : 100.500000

실수 : 100.000000

문자열: Python

문자열: 100

print('5 + 3 = 8')
print('%d + %d = %d' %(5, 3, 5+3 ))
더보기

5 + 3 = 8

5 + 3 = 8

print('%5d' %100)
print('%5d' %100)
print('%05d' %100)
더보기

    100

    100

00100

print('%.2f' %22222)
print('%6.2f' %123.45) # 6 : 총 자리수(점 포함), 2 : 소수 자리
print('%6.2f' %123.4) # 남은 자리는 0으로 채움
더보기

22222.00

123.45

123.40

# 5 / 3 = ?
print ('%d / %d = %d' %(5, 3, 5/3))
print ('%d / %d = %f' %(5, 3, 5/3))
print ('%d / %d = %4.2f' %(5, 3, 5/3))
더보기

5 / 3 = 1

5 / 3 = 1.666667

5 / 3 = 1.67

#'{} {}'.format('푸바오', '아이바오')
#인덱스 : 0부터 순서대로 진행되는 정수
print('{} - {}'.format('푸바오', '아이바오'))
print('{0} - {1}'.format('푸바오', '아이바오'))
print('{1} - {0}'.format('푸바오', '아이바오'))
더보기

푸바오 - 아이바오

푸바오 - 아이바오

아이바오 - 푸바오

print('이름 :  %s, 나이 : %d' %('푸바오', 3))
print('체중 : %2.f ' %96.3333)
print('판다 : {} {}'.format('아이바오','푸바오'))
더보기

이름 : 푸바오, 나이 : 3

체중 : 96

판다 : 아이바오 푸바오

 

'컴퓨터 비전 > 파이썬 기초' 카테고리의 다른 글

6. 파이썬 컬렉션 타입 - 세트  (0) 2023.12.07
5. 파이썬 컬렉션 타입 - 튜플  (2) 2023.12.07
4. 파이썬 컬렉션 타입 - 리스트  (2) 2023.12.07
3. 문자열 다루기  (1) 2023.12.07
2. 파이썬의 변수  (1) 2023.12.07

Streamlit

  • 파이썬으로 데이터 분석을 위한 웹앱을 쉽게 개발할 수 있게 도와주는 라이브러리
  • https://streamlit.io/

 

# 설치

# window
pip install streamlit

# mac
pip3 install streamlit

 

 

# 설치 확인 및 데모 확인

streamlit hello

 

 

#실행

- 터미널에서 입력

streamlit run 파일명

 

 

 

 

import streamlit as st

st.title('hi streamlit')
st.write('텍스트 구간')

'''
# 여기는 제목입니다.
### 여기는 작은 제목입니다.
- 첫번째 요소
- 두번째 요소
- 세번째 요소
'''

text = st.text_input('여기에 입력')
st.write(text)

selected = st.checkbox('개인정보 사용에 동의하시겠습니까?')
if selected:
    st.success('동의했습니다')

market = st.selectbox('시장',('코스닥','코스피','나스닥'))
st.write(f'선택된 market : {market}')

options = st.multiselect('종목',['카카오', '네이버','삼성','엘지'])
st.write(','.join(options))

st.metric(label='카카오', value= '40,000원', delta= '-1,000원')

 

# 실행 화면

 

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

Jinja 템플릿 엔진  (0) 2023.12.18
FastAPI  (0) 2023.12.16
픽사베이  (1) 2023.12.03
인스타그램  (1) 2023.12.03
셀레니움  (0) 2023.12.02

1. 이미지 수집하기

* [픽사베이](https://pixabay.com/ko/)

 

import chromedriver_autoinstaller
import time
from selenium import webdriver
from urllib.request import Request, urlopen
import ssl
ssl._create_default_https_context = ssl._create_unverified_context


driver = webdriver.Chrome()
url = 'https://pixabay.com/ko/images/search/음식/'
driver.get(url)

 

 

# 이미지가 있는 주소창 xpath
image_area_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div'

# 예시용 하나의 이미지 xpath
image_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]/div/a/img'

 

# 예시용 하나의 이미지 url가져오기

image_url = driver.find_element('xpath',image_xpath).get_attribute('src')
print('image_url:', image_url)

 

# 예시용 하나의 이미지를 나의 컴퓨터 파일안에 저장하기

- 사진을 pic.jpg 라는 이름으로 저장

image_byte = Request(image_url, headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64)'})
f = open('pic.jpg','wb') # w: write, r: read, a: append, b: binary, t: text
f.write(urlopen(image_byte).read()) 
f.close()

 

 

 

2. 여러개 이미지 수집하기

 

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = 'https://pixabay.com/ko/images/search/음식/'
driver.get(url)
time.sleep(3)


image_area_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div'
image_area = driver.find_element(By.XPATH, image_area_xpath)
image_elements = image_area.find_elements(By.TAG_NAME, 'img')

image_urls = [] #내용을 담을 빈 리스트

for image_element in image_elements:
    image_url = image_element.get_attribute('data-lazy-src')
    if image_url is None: # 주소가 없을시 src로 주소 뽑기
        image_url = image_element.get_attribute('src')
    print(image_url)
    image_urls.append(image_url) # image_urls 리스트에 주소 추가

 

from urllib import parse
import os

for i in range(len(image_urls)):
    image_url = image_urls[i]
    url = parse.urlparse(image_url) # 이미지 경로를 가져옴 / parse: 접속해서 데이터를 가져온후 저장까지 해줌 
    name, ext = os.path.splitext(url.path) #파일이름, 확장명

    image_byte = Request(image_url, headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64)'})
    f = open(f'pic{i}.jpg','wb') # w: write, r: read, a: append, b: binary, t: text
    f.write(urlopen(image_byte).read()) 
    f.close()

 

 

 

3. 함수로 리팩토링

  • crawl_and_save_image(keyword, pages)
  • os.mkdir('음식') /open('음식/파일이름.jpg', 'wb')

 

def crawl_and_save_image(keyword, pages):
    image_urls = []
    for i in range(1, pages+1):
        url = f'https://pixabay.com/ko/images/search/{keyword}/?pagi={i}'
        # print(url)
        
        driver.get(url)
        time.sleep(3)
        image_area_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div'
        image_area = driver.find_element(By.XPATH, image_area_xpath)
        image_elements = image_area.find_elements(By.TAG_NAME, 'img')
        
        for image_element in image_elements:
            image_url = image_element.get_attribute('data-lazy-src')
            if image_url is None:
                image_url = image_element.get_attribute('src')
            print(image_url)
            image_urls.append(image_url)
    
    
    if not os.path.exists(keyword):
        os.mkdir(keyword)
    
    
    for i in range(len(image_urls)):
        image_url = image_urls[i]
        
        # https://cdn.pixabay.com/photo/2016/12/26/17/28/spaghetti-1932466_1280.jpg
        filename = image_url.split('/')[-1]
        image_byte = Request(image_url, headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)'})
        f = open(f'{keyword}/{filename}', 'wb')
        f.write(urlopen(image_byte).read())
        f.close()
driver = webdriver.Chrome()
crawl_and_save_image('음식', 2)

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

FastAPI  (0) 2023.12.16
Streamlit  (2) 2023.12.03
인스타그램  (1) 2023.12.03
셀레니움  (0) 2023.12.02
크롤링(Crawling)  (0) 2023.12.02

1. 로그인

# 크롬창으로 인스타그램 홈 들어가기

import chromedriver_autoinstaller
from selenium import webdriver

driver = webdriver.Chrome()

url = 'http://www.instagram.com/'
driver.get(url)

 

# 아이디 비밀번호 입력후 로그인

#인스타로그인
id = '<나의 아이디>'
pw = '<나의 비밀번호>'


#아이디/비밀번호 칸 copy full xpath/  
input_id = driver.find_element('xpath', '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/section/main/article/div[2]/div[1]/div[2]/form/div/div[1]/div/label/input')
input_pw = driver.find_element('xpath', '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/section/main/article/div[2]/div[1]/div[2]/form/div/div[2]/div/label/input')


input_id.send_keys(id)
input_pw.send_keys(pw)

# 로그인 버튼 클릭
driver.find_element('xpath','/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/section/main/article/div[2]/div[1]/div[2]/form/div/div[3]').click()

 

 

2. 해시태그 검색

# 검색할 해시태그 'ootd'

 

hashtag = 'ootd'
url = f'https://www.instagram.com/explore/tags/{hashtag}/'
driver.get(url)

 

 

3. 스크롤 내리기

import time

for _ in range(1): #스크롤을 한번만 내림
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') 
    # 안에 자바스크립트 문법을 쓸 수 있다. 0부터 끝까지 스크롤 이동
    #time.sleep(3) #3초 쉬고 스크롤내리기

 

 

4. 원하는 사진 클릭하기

pic = '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/article/div/div/div/div[1]/div[3]/a'
driver.find_element('xpath',pic).click()

 

 

5. 좋아요 클릭

like = '/html/body/div[8]/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/section[1]/span[1]/div'
driver.find_element('xpath', like).click()

 

 

6. 댓글달기

comment = '/html/body/div[8]/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/section[3]/div/form/div/textarea'
msg = '★'
driver.find_element('xpath', comment).click()
driver.find_element('xpath', comment).send_keys(msg)

btn = '/html/body/div[8]/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/section[3]/div/form/div/div[2]/div'
driver.find_element('xpath',btn).click()

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

FastAPI  (0) 2023.12.16
Streamlit  (2) 2023.12.03
픽사베이  (1) 2023.12.03
셀레니움  (0) 2023.12.02
크롤링(Crawling)  (0) 2023.12.02

# 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