개발 이야기를 보다보면 '크롤링'이라는 단어가 자주 나와서 도대체 저게 뭘까? 뭔가 긁어오는 것 같은데 싶다가도 도저히 범접할 수 없는 영역이었다. 하지만 드디어 나도 이번주에 파이썬 크롤링을 배웠다! 하하하!
1. 3주차 복습
지난 시간까지 했던 '나홀로메모장' 페이지에 OpenAPI를 넣어보는 연습을 했다. 근데 정말 다 까먹어서 읭? 내가 뭐했었지? 싶었다.
<script>
$(document).ready(function () {
$('#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>
원래 있던 카드박스에서 영화 포스터와 설명들을 API로 불러와서 넣었다. 위에는 script 코드만 메모해둔 것이다.
파이썬도 설치하고, 기초 문법을 배웠다. 솔직히 지금 html, css, javascript, jquery까지 하다보니 문법이 머리 속에서 좀 섞인다. 아마 나중에 뭔가 결과물을 만들어야할텐데 그때 다시 문법을 찾아가면서 감을 되살려야할 것 같다. 적어도 구글링은 대학생 때 내내 하던 짓이라(나쁘게 말하면 과제 베껴쓰기?) 자신있기 때문에 괜찮다. 아마도? 괜찮겠지?
파이썬 pip(python install package)에서 requests도 깔았다.
import requests # requests 라이브러리 설치 필요
r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()
print(rjson['RealtimeCityAir']['row'][0]['NO2'])
requests를 활용해서 서울시 대기 OpenAPI에서 특정구의 NO2값을 가져와봤다. 그리고 다른 값도 가져오면서 연습을 계속했다.
드디어 오늘 밤에는 크롤링을 배웠다. 네이버 영화 페이지에서 영화 제목과 별점, 그리고 순위를 크롤링해왔다.
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:
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 태그 사이의 텍스트를 가져오기
print(rank,title,star)
pymongo로 DB 조작도 해봤는데, 직관적이라서 쉬웠다.
# 저장 - 예시
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'})
그리고 pymongo 기본 코드도 메모할 겸 적어본다.
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
# 코딩 시작
나머지는 내 숙제를 갖고오면서 정리해보겠다.
2. 숙제
이번 숙제는 지니뮤직의 1~50위 곡을 스크래핑 해보는 것이었다. 그러면서 strip() 함수도 검색을 통해 익혔다.
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
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')
songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for song in songs:
title = song.select_one('td.info > a.title.ellipsis').text.strip( )
rank = song.select_one('td.number').text[0:2].strip( )
artist = song.select_one('td.info > a.artist.ellipsis').text
print(rank,title,artist)
다른 부분은 다 할만 했는데, text[0:2]는 좀 생소했다. 텍스트의 0번째부터(0번째 글자 말고 글자 앞을 0으로 쳤다) 2번째까지를 출력하는 것이었다. strip( )는 빈 공간을 없앤다는 뜻이다.
이렇게 출력까지 됐으므로 대성공! 3주차도 무사히 완강해서 기쁘다^_^ 다음주부터는 사이드로 할 일이 생겨서, 더더욱 바빠질 것 같다. 정신 바짝 차리고 달려야지.
스파르타코딩클럽
왕초보 5주 완성! 웹/앱/게임 빠르게 배우고 내것을 만드세요!
spartacodingclub.kr
*위 링크로 접속하시면 강의료를 5만원 할인받으실 수 있습니다.*
'개발일지' 카테고리의 다른 글
[스파르타코딩클럽] 지옥의 3주차 앱개발 복습하기 (0) | 2022.04.22 |
---|---|
웹쓰리 개발자가 되기 위한 메모 (0) | 2022.04.17 |
[스파르타 코딩클럽] 앱개발 2주차 끝! 와 이번주는 조금 힘들었어 (0) | 2022.04.14 |
[스파르타코딩클럽] 웹개발 2주차 개발일지 (0) | 2022.04.11 |
코드 배운지 4일차... 간 크게도 디스코드 봇을 만지려 하다. (0) | 2022.04.08 |
댓글