11코딩완주챌린지 [3주차] 6일차

1.학습내용

✅꿀팁! 파이썬 코드 적은 후 실행할 때, 마우스 오른쪽 버튼 누르고 ▶️ Run 'hello' 누르기

✔ Python 기초문법
-변수

first_name = 'jiyoung'
num = 2
print(first_name+num)

에러가 뜬다!!!! 이렇게!
print(first_name+num)
TypeError: can only concatenate str (not "int") to str

TypeError: can only concatenate str (not "int") to str 구글링 시도해서

first_name = 'jiyoung'
num = str(2)
print(first_name+num) 완성!

-리스트형

a_list = ['사과', '배', '감']
a_list.append('수박')     <---
print(a_list)

이것도 리스트 추가 파이썬 구글링 시도해서 입력한 것!

-딕셔너리형

a_dict = {'name':'bob','age':27}
a_dict['height'] = 178        <---
print(a_dict)

-함수

def aa(num1,num2):
    print('안녕!')     --변수1
    return num1+num2   --변수2         
                              -----함수
result = aa(2,3)   
print(result)

-조건문

def is_adult(age):
    if age > 20:
        print('성인입니다')
    else:
        print('청소년입니다')
is_adult(30)
is_adult(15)

-반복문
[리스트 예제] 수박의 갯수를 세고 싶을 때,

fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
count = 0
for ff in fruits:
    if ff == '수박':
        count += 1
print(count)

[딕셔너리 예제]

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'],person['age'])
또는   
for person in people:
    if person['age'] < 20:
        print(person)

✔파이썬 패키지
: 패키지의 (파이썬의 기능들을 모아놓은)묶음을 모아놓은 라이브러리!

✔패키지 사용해보기

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

r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()

gus = rjson['RealtimeCityAir']['row']

for gu in gus:
    gu_name = gu['MSRSTE_NM']
    gu_mise = gu['IDEX_MVL']
    if (gu_mise > 50):
        print(gu_name,gu_mise)

✔ 웹스크래핑(크롤링) : 필요한 부분을 뽑아내는 것
[기본세팅]

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.nhn?sel=pnt&date=20200303',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# 코딩 시작

[예제]

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.nhn?sel=pnt&date=20200303',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

print(soup)

그 다음,

soup = BeautifulSoup(data.text, 'html.parser')

title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')    ''안에 들어가는 건 [그린북]에 검사 copy selector를 클릭해서 복붙하기!
print(title)
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>

이라고 뜰 것이다.
방법 1. "그린 북"을 가져오고 싶으면. print(title.text)
방법 2. "/movie/bi/mi/basic.naver?code=171539"을 가져오고 싶으면. print(title['href'])

이 상태는 select_one '그린 북'만 가져온 것이다.

그러나, select 모두 다 가져오고 싶을 땐, 콘솔창에서 html구조를 보아라.
[예제2]

<tr>...</tr>
<tr>...</tr>
....

에서 copy selector를 클릭해서 가져오면,

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

#old_content > table > tbody > tr 겹치기 때문에,

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

for tr in trs:
    print(tr)

tr들이 하나씩 나올거다.
아까, [그린 북]에서 copy selector를 떠서,
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a 이라고 나온다.

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

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')  <-나머지 부분들
    print(a_tag)

결과값에서 None이란 부분이 나올것이다. 그럴 땐,

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

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:    <- 넣는다.
        print(a_tag)
trs = soup.select('#old_content > table > tbody > tr')

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

✔ 웹스크래핑(크롤링) 연습하기

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.nhn?sel=pnt&date=20200303',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

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

for movie in movies:
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        rank = movie.select_one('td:nth-child(1) > img')['alt']     <-- ['alt'] 입력하기 전에 먼저 print(rank)를 해본 후 결과값에서 추출할 부분을 확인 후 넣는다.
        title = a_tag.text
        star = movie.select_one('td.point').text   <-- .text 입력하기 전에 먼저 print(star)를 해본 후 결과값에서 추출할 부분(텍스트)만 필요하므로
        print(rank,title,star)

✅#### 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

✅#### 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

✅#### 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

✔DB개괄
DB 데이터베이스를 저장해두는 프로그램이자 역할!!! (why? 데이터를 잘 가져다쓸려고)
-SQL 엑셀에 데이터를 저장하는 것과 가장 유사. 가장 정형화되어있어 분석 용이. ex. MS-SQL, MY-SQL
-NOSQL 딕셔너리형태로 데이터를 저장. 자유로운 형태로 데이터를 저장하는 대신 일관성이 부족. ex. mongoDB

2. 학습소감

오늘은 파이썬과 크롤링에 대해서 배웠는데, 파이썬은 앞에 배웠던 Javascript의 문법은 비슷하나. 쓰이는 기능은 쪼금씩 다른 거 말고는 크게 어렵지 않았다.
특히, 크롤링할 때, copy selector 클릭하기 위해서 가져오고 싶은 것을 잘 추출할 것이 중요!!!

좋은 웹페이지 즐겨찾기