소품집

[웹 크롤링] 퍼센트 인코딩을 활용한 웹크롤링 실습 본문

Web crawling

[웹 크롤링] 퍼센트 인코딩을 활용한 웹크롤링 실습

sodayeong 2020. 4. 8. 20:16

퍼센트 인코딩이란?


  • 퍼센트 인코딩(percent-encoding)이란 URL에 사용되는 문자를 인코딩 하는 방식이며 URL 인코딩이라고도 합니다. 아울러, 한글 인코딩 방식에 따라 결과가 달라집니다.
  • 퍼센트 인코딩 된 문자열을 디코딩하면 우리가 볼 수 있습니다. (urltools 패키지)
library(urltools)
# 문자열 하나를 설정합니다. windows에서 설정했다면 CP949 방식을 따릅니다.
string <- '소다영'
string %>% url_encode() # [1] "%bc%d2%b4%d9%bf%b5"

 

 

POST 방식 웹 크롤링 실습1

전화번호부 페이지 - https://www.isuperpage.co.kr/


# searchWord
URL <- 'https://www.isuperpage.co.kr/search.asp'
string <- '%C7%D1%BD%C4'
string %>% url_decode()

# 퍼센트 인코딩 
cityNm <- '서울'
cityNm %>% url_encode()
# POST()함수의 body인자에 할당할 검색어를 지정합니다.
upjong <- '일식'
cityNm <- '서울'
guNm <- '강남구'

 

# post 방식으로 http 요청
res <- POST(url = URL,
            body= list(serchWord=upjong %>% url_encode()%>% I(),
                       city=cityNm %>% url_encode() %>% I(),
                       gu=guNm %>% url_encode() %>% I()),
            encode = 'form')
            
# 보기좋게 출력
res %>% as.character() %>% cat()
# 서버의 로케일을 파악해서 제대로 변환하기
# 로케일의 인코딩 방식에 따라 퍼센트 인코딩 방식을 달리하는 함수 생성 (EUC-KR로 인코딩 방식을 채택한 웹서버에서만 적용됨)


pcntEncoding2Euckr <- function(string) {
  # 로케일의 인코딩 방식을 확인합니다. 
  if (localeToCharset() == 'UTF-8') {
    string <- string %>% iconv(from = 'UTF-8', to = 'EUC-KR')
    
  } else if (localeToCharset() %in% c('CP949', 'EUC-KR')) {
    
    string <- string
  }
  return(I(url_encode(string)))
}
# 제대로 유알엘 따오기
res <- POST(url=URL,
            body = list(searchWord = upjong %>% pcntEncoding2Euckr(),
                        city=cityNm %>% pcntEncoding2Euckr(),
                        gu=guNm %>% pcntEncoding2Euckr()),
            encode = 'form')
            
# POST 방식으로 HTTP 요청
URL <- 'https://www.isuperpage.co.kr/search.asp'
res <- POST(url=URL,
            body=list(searchWords=upjong %>%
                        url_encode() %>%
                        I(),
                      city=cityNm %>%
                        url_encode()%>%
                        I(),
                      gu=guNm %>%
                        url_encode()%>%
                        I()),
            encode='form')

 

 

 

 

정보수집


 

 

!! 업체명 추출

store <- res %>%
      read_html() %>%
      html_nodes(css='div.tit_list a.l_tit') %>%
      html_text() %>%
      as.data.frame()

 

!! 주소추출

address <-res %>%
  read_html() %>%
  html_nodes(css='div.l_cont2 span.loadv') %>%
  html_text() %>%
  as.data.frame()

 

!! 전화번호 추출

call <- res %>%
  read_html() %>%
  html_nodes(css='div.l_cont span.phone') %>%
  html_text() %>%
  as.data.frame()

 


 

 

연습문제


  • 업체의 전화번호와 주소를 추출하여 업체명까지 넣어 데이터 프레임으로 생성하세요. 
  • 화면을 찍어서 eclass에 오늘중으로 올립니다.
store <- res %>%
  read_html() %>%
  html_nodes(css='div.tit_list a.l_tit') %>%
  html_text()

call <- res %>%
  read_html() %>%
  html_nodes(css='div.l_cont span.phone') %>%
  html_text()

address <- res %>%
  read_html() %>%
  html_nodes(css='div.l_cont2 span.loadv') %>%
  html_text()

a<- cbind(store,call,address)
a<- as.data.frame(a)

728x90
Comments