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 클릭하기 위해서 가져오고 싶은 것을 잘 추출할 것이 중요!!!
Author And Source
이 문제에 관하여(11코딩완주챌린지 [3주차] 6일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yimji20/11코딩완주챌린지-3주차-6일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)