전에 학교에서 가볍게 파이썬으로 웹 크롤링하는 무료 강의를 들었던 적이 있다.
당시에는 무슨 말을 하는지도 모른 채 무작정 따라만 했는데,
최근 동아리에서 공부한 HTML에 대한 지식을 바탕으로
Jsoup 모듈을 사용해 웹크롤링을 해보니 전보다는 확실히 이해가 잘 된다.
이번에 크롤링한 사이트는 http://ncov.mohw.go.kr/
robots.txt 에는 없으니 따로 크롤링에 제약이 있는 것은 아닌 것 같다.
이번에 가져온 정보는 다음과 같다.
확진자수, 전날 대비 증가수, 국내유입, 해외유입, 사망자수, 격리중 사람 수, 격리 해제된 사람 수
템플릿에 관련 변수를 넣고, 크롤링하여 다음과 같은 코드를 작성하였다.
const scriptName = "kakao_link_test";
const kalingModule = require('kaling').Kakao();
const Kakao = new kalingModule();
importClass(org.jsoup.Jsoup);
Kakao.init('');
Kakao.login('', '');
function response(room, msg, sender, isGroupChat, replier, ImageDB, packageName, threadId) {
if(msg=='테스트'){
Kakao.send(room,
{ "link_ver": "4.0",
"template_object": { "object_type" : "feed",
"button_title": "테스트",
"content" : { "title": "테스트1",
"image_url": '',
"link": { "web_url": "",
"mobile_web_url": "" },
"description": "테스트2" },
"buttons" : [{ "title": "버튼",
"link" : { "web_url": "",
"mobile_web_url": "" }
}]
}
}
);
}
else if (msg == "test")
{
Kakao.send(room, {"link_ver" : "4.0",
"template_id" : 38890,
"template_args" : {}
},"custom");
}
else if (msg == "코로나 테스트")
{
let url = "http://ncov.mohw.go.kr";
let html = Jsoup.connect(url).get();
let data_all = html.select("#mapAll > div > ul > li:nth-child(1) > div:nth-child(2) > span").text();
let data_all_ch = html.select("#mapAll > div > ul > li:nth-child(2) > div:nth-child(2) > span").text();
let data_non_ex = html.select("body > div > div.mainlive_container > div.container > div > div.liveboard_layout > div.liveNumOuter > div.liveNum_today_new > div > ul > li:nth-child(1) > span.data").text();
let data_ex = html.select("body > div > div.mainlive_container > div.container > div > div.liveboard_layout > div.liveNumOuter > div.liveNum_today_new > div > ul > li:nth-child(2) > span.data").text();
let data_dead = html.select("#mapAll > div > ul > li:nth-child(5) > div:nth-child(2) > span").text();
let data_dead_ch = html.select("body > div > div.mainlive_container > div.container > div > div.liveboard_layout > div.liveNumOuter > div.liveNum > ul > li:nth-child(4) > span.before").text();
let data_care = html.select("#mapAll > div > ul > li:nth-child(3) > div:nth-child(2) > span").text();
let data_healty = html.select("#mapAll > div > ul > li:nth-child(4) > div:nth-child(2) > span").text();
let data_seoul = html.select("#main_maplayout > button:nth-child(1) > span.num").text();
let data_seoul_ch = html.select("#main_maplayout > button:nth-child(1) > span.before").text();
let data_gg_do = html.select("#main_maplayout > button:nth-child(9) > span.num").text();
let data_gg_do_ch = html.select("#main_maplayout > button:nth-child(9) > span.before").text();
Kakao.send(room, {"link_ver" : "4.0",
"template_id" : 39072,
"template_args" : {"new_out" : data_ex,
"new_in" : data_non_ex,
"new" : data_all,
"new_before" : data_all_ch,
"dead" : data_dead,
"dead_before" : data_dead_ch,
"care" : data_care,
"healthy" : data_healty,
"seoul" : data_seoul,
"seoul_before": data_seoul_ch,
"ggdo" : data_gg_do,
"ggdo_before" : data_gg_do_ch
}
}, "custom");
}
}
getImg = search => {
parse = Jsoup.connect("https://m.search.naver.com/search.naver?where=m_image&sm=mtb_jum&query=" + search).get().select("img[alt=" + search + "]");
if (parse.size()) {
img = parse.get(Math.random() * parse.size() | 0).attr("data-source");
return img;
}
return "";
};
다른 분이 작성하신 코드를보니 html의 구조적 반복을 이용해서 반복문으로 정보를 가져오신 분도 있으셨다.
나는 아직 그렇게는 못하니 하나씩 정보를 따왔다.
카카오 링크는 다음과 같은 형식으로 보내도록 하였다.
실제로는 우측의 이미지가 들어가지 않기 때문에,
이미지가 들어갈 부분까지 글자가 채워서 더 보기 좋다.
분명 더 보기좋게 정보를 나열해서 정리할 수 있을 것 같지만,
가볍게 만들려고 한 거라, 당장은 이렇게 정보를 나열하는게 최선인 것 같다ㅋㅋ
테스트를 해보면 다음과 같이 나온다.
리스트 사이사이의 간격이 넓다보니 뭔가 허전한 느낌이 없지않아 있지만
일단은 나름 성공적으로 웹에서 데이터를 크롤링해왔다.
첫 크롤링이 카카오톡 봇이 될 줄은 꿈에도 몰랐지만ㅋㅋ
언젠가 봇이 제한 조건의 자연어를 인식해서 코로나 현황을 불러온다면
다음과 같이 불러올 수도 있지 않을까 하는 기대를 해본다.
'개인 프로젝트 > [2020] 카카오톡 봇' 카테고리의 다른 글
[카카오톡 봇 만들기] 4. 이야기를 들어주는 봇 만들기(1) : 문장분석(2) (0) | 2020.10.29 |
---|---|
[카카오톡 봇 만들기] 4. 이야기를 들어주는 봇 만들기(1) : 문장분석(1) (0) | 2020.10.25 |
[카카오톡 봇 만들기] 3. 카카오링크 전송하기(1) : 테스트 & 봇 기능 수정 (3) | 2020.10.22 |
[카카오톡 봇 만들기] 2. 명령어로 조작하기(3) : 테스트 (0) | 2020.10.18 |
[카카오톡 봇 만들기] 2. 명령어로 조작하기(2) : 알고리즘 구현(2) (2) | 2020.10.16 |