비개발자의 웹개발

[스파르타 코딩 클럽] 비개발자를 위한 웹개발 3주차 개발일지 (1)

2023. 1. 3. 10:45

  2주차 강의를 여러번 반복해서 듣고 드디어 3주차에 접어들었다. 3주차에는 말로만 듣던 파이썬을 직접 다뤄보는 강의와 웹 크롤링 방법에 대한 강의로 이루어져 있다. 1주차에 비해 2주차가 꽤 어렵게 느껴져서 수강 완료하기까지 꽤 오래 걸렸는데, 3주차는 보다 직관적으로 사용할 수 있는 파이썬을 다루다보니 2주차에 비해 수월하게 느껴지긴했다.

 

[3주차 학습 내용]

1. 파이썬 기초

Javascript에 비해 직관적으로 입력하여 사용 가능

같은 줄이 같은 내용을 의미하므로 줄맞춤이 중요

(1) 변수: 값을 담는 것

let 없이 바로 입력, print결과 확인 (마우스 우클릭 > 실행)

a=3
b=2

print(a+b)

(2) 자료형

리스트 추가  a list.append() 

(참고) Javascript에서는 a_list.push()

(3) 함수

def로 정의

def sum(a,b):
    print('더하자!')
    return a+b

result=sum(1,2)
print(result)

실행: 더하자! 3

(4) 조건문

if, else 사용 동일

(5) 반복문

for ~ in ~ : 리스트 묶음 안에 있는 항목들 표시

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

for fruit in fruits:
    print(fruit)

실행: 사과, 배, 배, 감, 수박, 귤, 딸기, 사과, 배, 수박

 

count=0, if ~ == 'A' : count+=1 : 리스트 안에 'A'가 몇 개 있는지 표시 

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

count=0
for fruit in fruits:
    if fruit =='사과':
        count+=1

print(count)

실행: 2

 

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:
    if ppp['age']>20:
       print(ppp['name'])

실행: carry, ben

 

2. 파이썬에서의 패키지

크롤링을 하려면 다른 개발자들이 만들어놓은 라이브러리/패키지를 사용한다.

외부 라이브러리를 사용하기 위하여 패키지를 설치한다.

 

파이썬에서

패키지 : 모듈(일종의 기능들 묶음)을 모아 놓은 단위

라이브러리: 패키지의 묶음

 

가상환경(Virtual Environment): 프로젝트별로 패키지들을 담을 공구 

 

파일 > 설정 > 프로젝트 > phython 인터프리터 > +버튼 > 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. 웹스크래핑(크롤링) 기초

Beautifulsoup 사용하기

 

(1) 라이브러리 설치

파일 > 설정 > 프로젝트 > phython 인터프리터 > +버튼 > 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')

import의 의미: BeautifulSoup과 requests 사용

header의 의미: 코드에서 콜을 날리지만, 마치 브라우저에서 콜을 날리는 것처럼(사람인 것처럼) 보임

 

(2) 웹페이지에서 가져오고 싶은 부분

드래그 > 마우스 우클릭 > 검사 > 마우스 우클릭 > copy > copy selector

 

(3) 순위/타이틀/별점 등 특정 리스트를 가져오고 싶을 때

가져오려는 대상 중 일부를 copy selector 하여 공통부분을 찾는다.

 

(예시)

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

공통 부분 soup.select('')안에 넣어 movies를 정의한다.

 

movies 안에 있는 title 항목 하나씩 가져오려면

copy selector에서 다른 값을 나타내는 부분인 nth-child(X)를 제외하고

for문을 활용하여, title을 정의하여 모은다. title=movie.select_one('')

for movie in movies:
    title=movie.select_one('td.title > div > a')

만약 이 상태에서 print(title)을 실행하면

<a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a>
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
<a href="/movie/bi/mi/basic.naver?code=174830" title="가버나움">가버나움</a>

 

위와 같이 나타나므로 title의 텍스트만 나타내기 위해서는 print(title.text)로 실행한다.

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

for movie in movies:
    title=movie.select_one('td.title > div > a')
    if title is not None:
        print(title.text)

(4) 랭킹, 타이틀, 별점 모두 나타내기

 
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:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img

#old_content > table > tbody > tr:nth-child(2) > td.point
#old_content > table > tbody > tr:nth-child(3) > td.point

#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:
    title = movie.select_one('td.title > div > a')
    if title is not None:

        rank = movie.select_one('td:nth-child(1) > img')
        star = movie.select_one('td.point')

        print(rank['alt'],title.text,star.text)