본문 바로가기

R

[R] web scraping - selenium

F12 -> Network -> Name 에서 Request URL 못 찾을 때

반응형 웹사이트(made by 자스)

 

selenium

: 웹브라우저를 컨트롤하여 웹을 자동화하는 프로그램

1. chrome driver 다운로드
도움말>크롬정보
Chrome이 최신 버전입니다.
버전 98.0.4758.82(공식 빌드) (64비트)

https://chromedriver.chromium.org/downloads
맞는 버전(최대한 비슷한 버전) 다운로드

2. selenium jar file 다운로드

(chrome driver랑 같은 위치에 있어야함)
selenium-server-standalone-4.0.0-alpha-1.jar

3. 설치(in R)
install.packages("RSelenium")
library(RSelenium)

4. cmd(관리자권한 실행) 창에서 실행

(계속 실행하고 있어야 함)
cd c:/data 
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-4.0.0-alpha-1.jar -port 7777

remdr <- remoteDriver(remoteServerAddr='localhost',port=7777,browserName='chrome')
remdr$open() #크롬 켜기
remdr$navigate("https://www.naver.com") #네이버켜기
remdr$findElement(using='css',value='body')$sendKeysToElement(list(key='end')) #스크롤 가장 아래
remdr$findElement(using='css',value='body')$sendKeysToElement(list(key='home')) #스크롤 가장 위로
remdr$findElement(using='css',value='body')$sendKeysToElement(list(key='down_arrow')) #스크롤 조금씩 아래로
remdr$findElement(using='css',value='body')$sendKeysToElement(list(key='up_arrow')) #스크롤 조금씩 위로
remdr$close() #크롬창 닫기
remdr$screenshot(display = T) #R viewer로 보기
#검색창 찾아서 검색하기
remdr$navigate("https://search.naver.com/search.naver?where=image") #검색할 페이지
id <- remdr$findElement(using='id',value = 'nx_query') #검색창 찾기
id$setElementAttribute('value', '강아지') #강아지 입력
btn <- remdr$findElement(using='class',value = 'bt_search') #검색버튼 찾기
btn$clickElement() #검색버튼 클릭

#스크롤 반복하기 
for(i in 1:5){
  remdr$findElement(using='css',value = 'body')$sendKeysToElement(list(key='end')) 
  Sys.sleep(2)
}

이미지 다운로드

1. static 웹사이트

library(rvest)
html <- read_html("https://movie.naver.com/movie/bi/mi/basic.naver?code=191547")
#사진 주소 저장
img <- html_nodes(html,xpath='//*[@id="content"]/div[1]/div[2]/div[2]/a/img')%>%
  html_attr('src')
#img <- html_nodes(html,'div.poster>a>img')%>%html_attr('src')

#다운로드
download.file(img,destfile = "c:/data/1.jpg",mode = 'wb') #이미지는 wb 모드

2. dynamic 웹사이트

selenium을 이용해서 네이버 이미지 검색 후 다운로드

remdr <- remoteDriver(remoteServerAddr='localhost',port=7777,browserName='chrome')
remdr$open() 
remdr$navigate("https://search.naver.com/search.naver?where=image") #검색할 페이지
id <- remdr$findElement(using='id',value = 'nx_query') #검색창 찾기
id$setElementAttribute('value', '강아지') #강아지 입력

btn <- remdr$findElement(using='class',value = 'bt_search') #검색버튼 찾기
btn$clickElement() #검색버튼 클릭

#스크롤 반복하기(사진 더 많이 받기)
for(i in 1:5){
  remdr$findElement(using='css',value = 'body')$sendKeysToElement(list(key='end')) 
  Sys.sleep(2)
}
#소스받기!!필수!!
source <- remdr$getPageSource()[[1]]
html <- read_html(source) #소스내용 변환
remdr$close()
#사진 주소 저장
img <- html_nodes(html,xpath='//*[@id="main_pack"]/section[2]/div/div[1]/div[1]/div/div/div[1]/a/img')%>%
  html_attr('src')
#다운로드
for(i in 1:5){
  download.file(img[i],destfile = paste0("c:/data/dog_",i,".jpg"),mode = 'wb')
}

 

try()

: 예외상황(실행 중에 발생한 오류)이 발생했을 때 처리하는 기능

lst <- list(x=10,y='20',z=30)

for(i in lst){
  try(print(100/i))
}

for(i in lst){
  try(print(100/i),silent=T) #silent=T : 오류메세지 출력하지 않고 진행
}

tryCatch

: 에러파일 따로 저장

error_files <- c()
for(i in 1:5){
  tryCatch(download.file(x[i],destfile = paste0("c:/data/image/dog",i,".jpg"),mode = 'wb'),
           error=function(arg){error_files <<- c(error_files,x[i])})
}
#for문 밖에 있는 함수(global)에 for문 안(local)에서 넣을때 <<- 사용

[문제208] 다음 포털 이미지 검색에 검색어를 입력한 후 이미지 url을 수집한 후 이미지 파일을 저장해주세요.

remdr <- remoteDriver(remoteServerAddr='localhost',port=7777,browserName='chrome')
remdr$open() 
remdr$navigate("https://search.daum.net/search?w=img") 
id <- remdr$findElement(using='id',value = 'q') 
id$setElementAttribute('value', '고양이') 

btn <- remdr$findElement(using='id',value = 'daumBtnSearch') 
btn$clickElement() 

#더보기 버튼 클릭
for(i in 1:5){
  webelem <- remdr$findElement(using = 'xpath',value='//*[@id="imgColl"]/div[5]/a[1]')
  webelem$clickElement()
  Sys.sleep(2)
}

source <- remdr$getPageSource()[[1]]
html <- read_html(source)
remdr$close()

img <- html_nodes(html,xpath='//*[@id="imgList"]/div/a/img')%>%
  html_attr('src')

error_files <- c()
for(i in 1:length(img)){
  tryCatch(download.file(img[i],destfile = paste0("c:/data/image/cat",i,".jpg"),mode = 'wb'),
           error=function(arg)error_files <<- c(error_files,img[i]))
}

[문제209] 중앙일보에서 "인공지능" 뉴스기사의 url을 추출하세요.

remdr <- remoteDriver(remoteServerAddr='localhost',port=7777,browserName='chrome')
remdr$open() 
remdr$navigate("https://www.joongang.co.kr/search/news?keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5")

#아래로 스크롤 후 더보기 버튼 클릭
for(i in 1:5){
  remdr$findElement(using='css',value = 'body')$sendKeysToElement(list(key='end'))
  article <- remdr$findElement(using = 'xpath',value='//*[@id="container"]/section/div/section/div/a')
  article$clickElement()
  Sys.sleep(2)
}

source <- remdr$getPageSource()[[1]]
html <- read_html(source)
remdr$close()

url <- html_nodes(html,xpath='//*[@id="container"]/section/div/section/ul/li/div[2]/h2/a')%>%
  html_attr('href')

'R' 카테고리의 다른 글

[R] text mining  (0) 2022.02.15
[R] 다나와 사이트 Web scrapling(selenium)  (0) 2022.02.15
[R] web scraping - css, xpath,JSON  (0) 2022.02.10
[R] 크롤링, 스크래핑  (0) 2022.02.09
[R] 텍스트 마이닝  (0) 2022.02.08
Recent Posts
Popular Posts
Recent Comments