0.1 packages

0.1.1 Selenium

  • RSelenium

0.1.2 Data processing

  • tidyverse

0.1.3 Parallel computing

  • foreach
  • doParallel

1 下載連結

1.1 Selenium

將下載的檔案放到 cmd 路徑,下圖範例為 C:\Users\User

1.2 ChromeDriver

下載完後將檔案解壓縮到 Chrome.exe 所在的資料夾,以下為範例路徑

C:\Program Files (x86)\Google\Chrome\Application

  • 注意! 避免不必要的錯誤, chrome 請更新至最新版本

再到環境變數的 PATH 增加 C:\Program Files (x86)\Google\Chrome\Application;

若無 PATH 請自行新增

2 啟動 Selenium

  • 開啟 cmd 輸入

java -jar selenium-server-standalone-3.4.0.jar

3 常用函數

  • 選擇瀏覽器(以 chrome 為例)

remDr <- remoteDriver(browserName = “chrome”)

  • 開啟瀏覽器

remDr$open()

  • 轉至所輸入的網址

remDr$navigate(‘https://www.artprice.com/’)

  • 抓特定位置

remDr$findElement()

  • 抓多個位置

remDr$findElements()

  • 顯示目前的網址

remDr$getCurrentUrl()

  • 上一頁

remDr$goBack()


函數名稱非常直觀

函數名稱非常直觀

3.0.1 注意事項

  • 不要手動控制網頁,例如自己按重新整理或上一頁,所有動作必須由函數執行,否則會產生 Error
  • 即使由函數控制返回上一頁,只要離開該頁面之後,該頁面所執行的函數必須重新執行一次
remDr$navigate(url = 'https://tw.yahoo.com/')

test <- remDr$findElement(using = 'css',value = '#UHSearchBox')
test$setElementAttribute(attributeName = 'value',value = 'NSYSU')
test$submitElement()

# 完成搜尋之後,使用 goBack() 返回上一頁
remDr$goBack()

test$setElementAttribute(attributeName = 'value',value = 'NSYSU')

# 直接執行 setElementAttribute() 會遇到 error
# 必須再執行一次 remDr$findElement()

test <- remDr$findElement(using = 'css',value = '#UHSearchBox')
test$setElementAttribute(attributeName = 'value',value = 'NSYSU')

4 開始爬蟲

remDr <- remoteDriver(browserName = "chrome")
remDr$open()
remDr$navigate('https://www.artprice.com/')

4.1 先選擇目標位置


以下使用 css (Copy selector) 操作,亦可選擇 Xpath

#Xpath寫法  
#        remDr$findElement('xpath','//*[@id="sln_searchbar"]')

input <- remDr$findElement('css','#sln_searchbar')
input$setElementAttribute(attributeName = 'value',value = 'AHAE')
input$submitElement()

4.1.1 有些函數只存在 Element 變數中

在remDr中,沒有 setElementAttribute()

在remDr中,沒有 setElementAttribute()


5 實例

  • 開啟平行運算
cl<-makeCluster(4,"SOCK")
registerDoParallel(cl)

  • 爬蟲函數 cc
cc <- function(pf,pt){
  nlist <<- list()
  remDr <- remoteDriver(browserName = "chrome")
  remDr$open()
  remDr$navigate('https://www.artprice.com/')
  
  for(i in pf:pt){
    ser <- remDr$findElement('css','#sln_searchbar')
    ser$setElementAttribute('value',artist_korean$姓名[i] %>% as.character())
    ser$submitElement()
    uu <- remDr$getCurrentUrl()
    if(isTRUE(grepl('search?',uu))){
      tryCatch(nn <- remDr$findElement('css','body > div.container-fluid.font.font-14 > div:nth-child(2) > div > div.row.artist-content > div > table > tbody > tr.visible-xs > td > p:nth-child(1) > a'),
               error = function(e){nn <<- 'na'})
      tryCatch(nlist <<- c(nlist,nn$getElementAttribute(attrName = 'href')),
               error = function(e){nlist <<- c(nlist,'na')})
    } else { nlist <<- c(nlist,uu)}
    Sys.sleep(1)
    remDr$goBack()
  }
  return(nlist)
  }

最後輸出結果存在 zz 變數中

最後輸出結果存在 zz 變數中

zz <- foreach(i = 1:4,.combine = 'c',.packages = c('tidyverse','RSelenium')) %dopar% {
  switch(i,
         cc(pf = 1,pt = 330),
         cc(pf = 331,pt = 660),
         cc(pf = 661,pt = 990),
         cc(pf = 991,pt = 1322))
         
  }

  • 關閉平行運算
stopImplicitCluster()
stopCluster(cl)