관리 메뉴

개발캡슐

2022.07.08_3주차_Python, gitbash, mongoDB- 설치 및 크롤링/스크래핑_1강~7강 본문

스파르타코딩클럽-항해99_9기/3주차_Python, mongoDB, Flask, 크롤링, 스크랩핑

2022.07.08_3주차_Python, gitbash, mongoDB- 설치 및 크롤링/스크래핑_1강~7강

DevGreeny 2022. 7. 18. 19:37

<목차 겸 요약>
파이썬 기초
파이썬 패키지(requests 라이브러리, beautifulsoup라이브러리)
웹크롤링, 스크래핑
웹크롤링, 스크래핑 해온 거 데이터 보여주기

3-1강.파이썬(Python) 및 gitbash설치

3주차 배울 것: Python, 크롤링, mongoDB

  • 파이썬 설치, gitbash 설치할 거야. 간단해.
  • 문법 익히기
  • 네이버 영화를 크롤링해와서 데이터베이스에 넣고 조작까지.

 

=> 개인적인 질문 : 나중에 크롤링 & 스크래핑 차이 찾아보기


3-2강.연습 겸 복습 - 스파르타피디아에 OpenApi붙여보기

  • file_name: index_302.html (파이참)
                  pythonprac/hello.py (파이썬)
  • 참고 스니펫 : 로딩 후 호출하기

1_복습

1. OpenApi 붙여보기

 

 

 

 

2.로딩 후 호출하기(로딩하자마자 호출하기)

  • 형태
$(document).ready(function(){ });

 

 

  • 로딩 후 호출하기 - 코드 스니펫
<script>
    $(document).ready(function(){
    		listing();
    });

    function listing() {
    		console.log('화면 로딩 후 잘 실행되었습니다');
    }
</script>

 


  • '로드가 다 되면 실행되는 함수'를 하나 정의해서 만들어.
<script>
    function listing() {
                console.log('화면 로딩 후 잘 실행되었습니다');
            }
</script>

 

=>listing() 함수 정의 해놓은 것 : console.log('화면 로딩 후 잘 실행되었습니다.')라고 console.log로 콘솔창에 값을 띄우기를 할 listing()이란 함수야~

  • 로딩 후 바로 정의해놓은 listing() 함수 호출해!
<script>
    $(document).ready(function () {
                listing();
            });
</script>

 

=> 결과물 : 잘 되서 로그가 뜸.

 

 

 

3-3강. 파이썬 시작하기

  • sparta 폴더 => pythonprac 폴더 만들고 시작할거야.
  • 파이참에서 파이썬 시작 - pythonprac폴더에 프로젝트를 만들거야
    • 1: [파일] - [새 프로젝트] -
    • 2: 저장할 파일 위치(location) 선택 - sparta/pythonprac
    • 3: 위치 - pythonprac에 /venv폴더 유무, 기본 인터프리터 : python38(pythono3.8) 확인
    • 4: '웰컴 스크립트 생성' 체크해제
    • 5: Create(생성) -> this window(이 창에서)

 

  • 실행 후, 상단 왼쪽아래에 프로젝트를 클릭 시, [pythonprac]안에
    [venv]라는 폴더가 보이지만 안 보이는 애다 생각하고 신경을 아예 안 쓰면 된다. 건들면 x
    => 참고

 

  • pythonprac - 새로만들기 - python파일 - file_name: hello - hello.py 파일 생성됨.
print('hello sparta!!');

 

 

  • 파이썬(python) 문법은 javascript보다 더 직관적이야.
  • 왜 더 직관적인지 다음 강에서 보여주지...뜨든

 

 


3-4강. 파이썬 기초공부

  • file_name: hello.py (파이썬)
  • 변수, 자료형, 함수, 조건문, 반복문

1_변수

  • 예제1)
a = 2
b = 3

print(a+b)
#실행 후
#5
#이렇게 5를 찍어주는게 print

 

 

 

  • 예제2)
a = 'haerhee'
b = 'nam'

print(a+b)
#실행 후
#haerheenam

 

 

 

2_자료형 : 리스트(list) 형식, 딕셔너리(dictionary)형식

1. 리스트

  • 예제1)
a_list = ['사과','배','감']

print(a_list[1])
#실행 후
#배

#print(a_list[2])
#실행 후
#감

 

 

  • 예제2)
a_list = ['사과','배','감']

a_list.append('수박')

print(a_list)
#실행 후
#['사과','배','감','수박']

 

 

2.딕셔너리

  • 예제)
a_dict = {
    'name':'bob',
    'age':27
}

print(a_dict['name'])
#실행(오른쪽 키 통해)후
#bob

 

 

3_함수

  1. 예제1) 사칙연산
def sum(a,b):  #:를 쓰고 바로 return a+b 를 쓰는 이유는 파이썬은 직관적이라 어차피 줄을	
    return a+b #맞춰서 쓸 건데 왜 중괄호 같은 걸 쓰니, 그냥 줄을 맞추자.

result = sum(1,2) # sum(1,2)값이 result에 들어가고 3이 찍힌다.
print(result)
#실행 후
#3

 

    • def : definition의 약자
    • return : 나를 변신시켜라. 함수에서 값을 반환하기 위해 써.
    • => return a+b => a+b로 나를 변신시켜(반환해)라는 의미.

 

  • 예제2) 만약 print('더하자!') 라고 쓰면 어떻게 될까.
def sum(a,b):
    print('더하자!') #더하자가 먼저 찍히고
    return a+b      #3으로 나를 변신시키자

result = sum(1,2) #sum(1,2) 는 3이 되고 result에 3이 들어갈 거고
print(result)     
#실행후
#3 이 찍힌다.

 

 

4_조건문

  • 예제)
def is_adult(age): //def is_adult는 age를 받는다.
    if age > 20     //이렇게 tab을 한 게 나(윗 글)의 내용물입니다.
    	print('성인입니다') //이렇게 tab을 한 게 나(윗 글)의 내용물입니다.
    else:
        print('청소년입니다')
        

#is_adult(15)
#실행후
#청소년입니다

#is_adult(25)
#실행후
#성인입니다

 

=> 파이썬에선 들여쓰기가 중요해.

 

5_반복문

1.리스트

  • 예제1
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

for fruit in fruits:
    print(fruit)
    
#실행 후 
#사과
#배
#배
#감
#수박
#귤
#딸기
#사과
#배
#수박

 

 

 

 

=> 자바스크립트는 어차피 반복문 다 리스트랑 같이 써. ex) rows

=> 파이썬리스트와 함께 쓰도록 기획되어있어.

=> 리스트의 요소들을 하나씩 꺼내서 내용물로 써.

 

 

  1. 예제2
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

count = 0 #count가 0부터 시작해.
for aaa in fruits:
    if aaa == '사과' : #aaa가 만약에 사과라면
    	count +=1 #count를 하나 늘려줘. for문은 여기까지가 내용끝.
        		 #그리고 다 돌고나면
       
print(count)
#실행후
#2

 

 

2.딕셔너리

  • 예제)
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: //보통 단수 복수 이렇게 쓴다. 이름 쓸 때.
    print(person)
    
#실행후
#
#{'name': 'bob', 'age': 20} 
#{'name': 'carry', 'age': 38}
#{'name': 'john', 'age': 7}
#{'name': 'smith', 'age': 17}
#{'name': 'ben', 'age': 27}

 

 

 

4_파이썬이 자바스크립트와 가장 다른 부분

  • 예제)
people = [{'name': 'bob', 'age': 20}, 
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]

for ppp in people:  //people하나씩 꺼내서 쓰겠다
	if ppp['age'] > 28 //ppp의 age가 28보다 크다면
    	print(ppp['name']) // ppp의 name을 출력해라.
    
#실행후
#carry
#ben

 

=> 전형적인 형태야.

 

 

3-5강. 파이썬 패키지 설치

  • file_name: dbprac/hello.py (파이썬)
  • 크롤링을 하려면 남들이 만들어 놓은 라이브러리를 써야하는데 이를 패키지라고 함.

패키지 설치 = 외부 라이브러리 설치

 

1_가상환경(virtual environment ) - 프로젝트별로 패키지들을 담을 공구함

  • 1:00 분 시간대 강의
  • 라이브러리를 모아두는 곳.
  • 줄여서 venv

2_venv 폴더. = 라이브러리 공구함.

  • 패키지 설치
  • requests - 패키지 설치
    => ajax 역할을 하는 패키지.

 


3-6강. 패키지 사용

  • file_name : hello.py
  • requests 패키지 사용

requests 라이브러리 쓰는 법

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

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

print(rjson)
#실행후
#get한 주소의 내용(rows)들이 보여짐

 

 

- rjson => 로 요리할거야

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

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

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

print(rows)
#실행후
#RealtimeCityAir의 row가 보여짐.


=> RealtimeCityAir의 row들

 

- 확인해본 row를 돌려보자(for~ in~:)

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

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

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

for row in rows:
    print(row)

 

 

=> 실행후 파이썬 결과창: 뭉쳐있던 row를 한 줄씩 뺴서 보여줌.

 

 

 

 

- 구이름과 미세먼지 수치들이 쭉쭉쭉 결과창에 나와.

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']#여기까진 
    print(gu_name, gu_mise)

 

 

- gu_mise의 수치가 60보다 작은 gu_name들 찍어주는 걸로.

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-7강. 웹스크래핑(크롤링)기초

  • 2022.07.11 ~ 2022.07.13
  • file_name: hello.py
  • 참고스니펫 - 네이버 영화 코드스니펫
  • beautifulsoup 패키지 - 쉽게 홈페이지 html의 세부 내용 예쁘게 찾개 해주는 패키지
  • beautifulsoup 패키지 설치
    • ctrl + alt + s(setting) 설정 -> 프로젝트 -> python 인터프리터 -> "+"모양(패키지)
      -> 'bs4' 검색 - bs4(beautifulsoup) 패키지 설치

 

  • 크롤링 기본 세팅 구조
import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
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)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

#############################
# (입맛에 맞게 코딩)
#############################

 

1. ''크롤링 기본 세팅'' 코드스니펫 이용

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)

 

=> print(soup)을 쓰고 실행 후, 해당 네이버 영화의 html이 실행창에 들어와서 뜨는 걸 볼 수 있음

  • header => 코드에서 콜을 날려, 근데 마치 브라우져에서 콜을 날리는 것 처럼 사람인 것처럼.
#data = requests.get()의 끝에 header = headers 라고 쓰인다(위 코딩 참고)

 

2. beautifulsoup을 사용하는 방법 (파이썬 문법이 아님)

  • 네이버 영화 코드스니펫홈페이지 → 영화랭킹 랭킹 평점순(모든영화) 1순위 영화의 마우스 오른쪽 클릭 '검사' 그 제목 라인 태그에 오른쪽 마우스 클릭 copy - > copy selector
  • 이후,
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) #_one인 이유는 일단 하나만 할 거니까.
    
print(title)
#실행결과창
#밥정

 

=> title = soup.select_one() 적어주고 괄호 안에 copy selector 값을 붙여준다. 괄호 안의 내용이 그 내용.

=> 실행결과창에 밥정의 태그라인이 보여진다. (아래 이미지)

 

  • print(title) -> print(title.text) - title에 .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')

title = soup.select_one(#old_content > table > tbody > tr:nth-child(2) > td.title > div > a) #_one인 이유는 일단 하나만 할 거니까.
    
print(title.text)
#실행후

 

 

=> 결과 : '밥정'

 

  • 다시 원점에서, print(title) 상태에서.
    <a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a>

 

 

  • 실행 후, 이 부분에서 태그의 속성href="주소" 을 찾고싶다면
import requests  # requests 라이브러리 설치 필요

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

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(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

movies = soup.select('#old_content > table > tbody > tr')
print(title['href'])

 

=> 결과: href 의 내용/movie/bi/mi/basic.naver?code=186114 만 뜸.

 

=> 이 경우는, select_one 일 때.

  • select_one . 하나만이 아닌 여러 개일 때
import requests  # requests 라이브러리 설치 필요

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

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)

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

movies = soup.select('#old_content > table > tbody > tr')

print(movies)

 

=> 결과창: <tr>..</tr> 이게 나옴.

 

  • a태그 값들
import requests  # requests 라이브러리 설치 필요

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

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(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > 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)

 

 

  • a태그 값의 제목(text)들
import requests  # requests 라이브러리 설치 필요

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

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(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > 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)

 

=> is not None??? => ==$0 => 이 부분 구글링 & 질문
=> movies => tr의 "전체"
=> movie는 tr의 전체 중 일부

 

=> 결과 : 제목들 뜨든