웹개발종합반 3주차 강의 후기

EITA_0731·2022년 3월 8일
0
post-thumbnail

3주차 강의내용

파이썬 기초문법 / 크롤링 / mongoDB사용하기

(1) (복습)API값 가지고오기 - Ajax

  • 나홀로 메모장 API로 정보 가지고 오기(폴더:sparta>frontend>index.html)
<script>
    $(document).ready(function () {
        //cards-box값 비우기
    	$('#cards-box').empty('');
        listing();
    });

    function listing() {
        $.ajax({
				  type: "GET",
				  url: "http://spartacodingclub.shop/post",
				  data: {},
				  success: function (response) {
				      let articles = response['articles'];
				      for (let i = 0; i < articles.length; i++) {
				          let article = articles[i];
				          let image = article["image"];
				          let url = article["url"];
				          let title = article["title"];
				          let desc = article["desc"];
				          let comment = article["comment"];
				          let temp_html = `<div class="card">
				                             <img class="card-img-top" src="${image}" alt="Card image cap">
				                             <div class="card-body">
				                               <a href="${url}" target="_blank" class="card-title">${title}</a>
				                               <p class="card-text">${desc}</p>
				                               <p class="card-text comment">${comment}</p>
				                             </div>
				                           </div>`;
				          $('#cards-box').append(temp_html);
				      }
				  }
				})
    }

    function openclose() {
        // id 값 post-box의 display 값이 block 이면
        if ($('#post-box').css('display') == 'block') {
            // post-box를 가리고
            $('#post-box').hide();
            $('#btn-posting-box').text('포스팅 박스 열기');
        } else {
            // 아니면 post-box를 펴라
            $('#post-box').show();
            $('#btn-posting-box').text('포스팅 박스 닫기');
        }
    }
</script>

(2) python - 패키지 사용하기(requests)

  • 서울시 대기 OpenAPI에서, IDEX_MVL 값이 60 미만인 구만 찍어주기
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:
	if gu['IDEX_MVL'] < 60:
		print (gu['MSRSTE_NM'], gu['IDEX_MVL'])

(3) python - 크롤링(beautifulsoup4)

  • 크롤링하여 영화제목 가지고 오기
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.nhn?sel=pnt&date=20200303',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        # a의 text를 찍어본다.
        print (a_tag.text)
  • bs4 기본 개념
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

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

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

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

(4) python - mongoDB조작하기(pymongo)

  • 기본 셋팅
from pymongo import MongoClient           # pymongo를 임포트 하기
client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
  • pymongo 기본 코드(저장,찾기,바꾸기,지우기)
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
same_ages = list(db.users.find({'age':21},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

(5) 크롤링 결과 DB에 저장/가져오기

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.

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

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    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'] # img 태그의 alt 속성값을 가져오기
        title = a_tag.text                                      # a 태그 사이의 텍스트를 가져오기
        star = movie.select_one('td.point').text                # td 태그 사이의 텍스트를 가져오기
        doc = {
            'rank' : rank,
            'title' : title,
            'star' : star
        }
        db.movies.insert_one(doc)

#매트릭스 평점 가지고 오기
target_movie = db.movies.find_one({'title':'매트릭스'})
print (target_movie['star'])

#매트릭스와 평점 같은 영화 제목 가지고 오기
target_star = target_movie['star']
movies = list(db.movies.find({'star':target_star}))

for movie in movies:
    print(movie['title'])
    
#매트릭스 평점 '0'으로 바꾸기
db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})

(6) 3주차 과제 - 지니뮤직 크롤링

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://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)

(7) 느낀점

처음에 Javascript로 공부할때는 구문자체가 좀 복잡하다는 느낌이 있었는데 jQuery와 jAax가 사용하기 간편한 것 같다. python은 자바를 공부해놔서 인지 크게 어려움이 있지는 않았다. 크롤링 하는 것도 처음 접해보는 거라 재미있게 배울수 있었다.

profile
기술 스택 : Javascript/Java/Spring Framework

0개의 댓글