• mksong8

[웹크롤링] 내가 가장 먼저 핫딜 정보를 알고 싶다면?




| 들어가는 말 ​ 이번 글에서는 API가 제공되지 않는 경우 웹크롤링으로 비정형 데이터를 얻는 방법으로 이번 문제를 접근해 보겠습니다. ​ 먼저, 온라인 핫딜 정보를 얻기 위해서는 주기적으로 웹사이트를 방문하여 가격을 확인해야 합니다. 그러나 이 작업은 매우 반복적인 작업입니다. 저렴한 비행기 티켓을 얻기 위해 자동화 프로그램을 이용하는 방법을 참고하여 맥북 핫딜 자동 알림 프로그램을 만들어 보도록 하겠습니다. ​ ​ | 목적 ​ 온라인 쇼핑몰의 맥북 가격이 특정 가격 이하로 떨어지면 자동으로 이메일 알림을 받습니다.



| 접근 방법 ​ ● 먼저 온라인 쇼핑몰의 제품 정보를 스크래핑 하기 위해 웹사이트 구조를 분석합니다. R의 rvest를 이용하겠습니다. ​ ​ library(rvest) library(XML) #save html of URL url <- "http://www.***.com/category/4945/?p=1&l-id=pagen_1" ​ html 파일의 페이지 소스를 분석하여 필요한 정보인 가격과 제품 정보를 찾습니다. ​ <div class=”b-content”> 부분이 제품 관련 정보가 있는 부분입니다. 이 부분을 추출하도록 하겠습니다. ​ product <- url %>% read_html() %>% html_nodes(".b-content") ​



​ 크롬의 SelectorGadget를 이용하면 직관적으로 콘텐츠를 선택할 수도 있습니다. ​ 제품명을 추출해 보겠습니다. ​ name <- product %>% html_nodes(".product-name") %>% html_text() ​ 가격을 숫자 형식으로 추출해 보겠습니다. ​ price <- product %>% html_nodes(".b-underline .b-text-prime") %>% html_text() %>% gsub(",","",.) %>% as.numeric() ​ 제품명과 가격을 데이터 프레임에 저장하겠습니다. ​ all <- data.frame(name, price, stringsAsFactors = FALSE) ​ 여러 페이지에서 정보를 수집하겠습니다. ​ for (i in 1:10){ starturl <- "http://www.***.com/category/4945/?p=" nexturl <- "&l-id=pagen_" url <- paste(starturl,i,nexturl,i,sep="") product <- url %>% read_html() %>% html_nodes(".b-content") name <- product %>% html_nodes(".product-name") %>% html_text() price <- product %>% html_nodes(".b-underline .b-text-prime") %>% html_text() %>% gsub(",","",.) %>% as.numeric() mydata <- data.frame(name, price, stringsAsFactors = FALSE) all <- rbind(all,mydata) } all<-all[!duplicated(all),] ​



​ ● 이번에는 이메일로 알림을 보내는 규칙을 만들어 보겠습니다. 노트북의 가격이 50만 원에서 100만 원 사이인 제품만 알람을 받도록 해 보겠습니다. ​ alert <- all[all$price>500000&all$price<=1000000,] ​ 다음과 같이 알람이 1개 이상이 되면 mailR 패키지를 이용하여 이메일을 보내도록 하겠습니다. ​ if (nrow(alert) >=1){ write.table(alert,"alert.txt",fileEncoding = "UTF-8") send.mail(from = "up****@gmail.com", to = c("up****@gmail.com"), subject = "Mac Deal Alert", body <- "alert.txt", smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "up****@gmail.com", passwd = "xxxxxxxx", ssl = TRUE), encoding = "utf-8", authenticate = TRUE, send = TRUE) } ​ ● 이 작업을 정기적으로 수행하도록 예약 기능을 구현해 보겠습니다. ​ taskscheduleR 패키지를 사용하여 구현해 보겠습니다. Rscript로 주기적으로 실행하여 자동 알람 메일을 발송하도록 구현합니다. ​



| 마치면서 ​ 웹 데이터를 수집한 사이트는 동적인 스크립트를 위한 코드가 필요하지 않았지만 경우에 따라 로그인 등의 추가 작업이 필요한 경우도 있습니다. 그리고 scrapy, BeautifulSoup을 사용하여 Python으로 구현할 수도 있습니다. ​ 나만의 핫딜 메일링 자동화 프로그램을 설명해 보았는데요, 도움이 되셨는지요? 더 많은 도움이 필요하시다면 유펜솔루션에 문의해 보세요. : )


조회 38회

​고객센터

Tel: 02-596-8900  Fax : 02-6930-5709

10시 - 오후 7시(토, 일요일 및 공휴일은 휴무)

개인정보관리책임자 : 황재준   상호 : 유펜솔루션   대표자 : 김재훈   사업자등록번호 : 426-86-00939
주소 : (본사)대전광역시 유성구 엑스포로446번길 38, 3층 302호 / (지사 및 연구소)서울시 성동구 연무장 15길 11, B동 2층
​ⓒ 2019 UpennSolution Co., Ltd. All rights reserved.