在撰寫爬蟲程式的時候,有一個很重要的問題要注意便是當要爬取特定網站的大量資料時,通常網站管理員會對你的爬蟲做“處理”,針對你的ip做禁止,而每個網站處理的方式不同,可以看這些資料:
How do websites block web crawlers?
Web Crawlers: Love the Good, but Kill the Bad and the Ugly
看完就會知道原來…自己的爬蟲會遭遇什麼可怕的事情,這時候處理注意一些連線數和頻率的問題外,可以使用proxy來保護自己的ip,至少被禁止後還可以換個proxy來爬,另一方面,使用proxy最大的問題就是連線不穩定,所以就會需要寫一些error handler的機制,這邊主要分享一下使用httr和rvest時,如何使用proxy,另外,還有分享使用tryCatch來處理connect problem。
在httr包中,有use_proxy這個函數,可以用來設定httr::GET裡面的網路設定,裡面還可以自己定義很多http裡頭的設定,像是add_headers, authenticate, config, set_cookies, timeout, user_agent, verbose都是。
set_proxy <- use_proxy("64.251.21.73", 8080, username = NULL, password = NULL, auth = "basic") GET("http://had.co.nz", use_proxy("64.251.21.73", 8080)) GET("http://had.co.nz", set_proxy) #url 放proxy的ip,為字串 #port 放埠口,為數字(容易弄錯)
而基本上,rvest是使用httr為基底的,所以也可以使用,這邊是read_html的範例代碼,可以看出其關係
# From a url: google <- read_html("http://google.com", encoding = "ISO-8859-1") # From an httr request google2 <- read_html(httr::GET("http://google.com")) # 所以可直接將use_proxy用在rvest裡面,雖然rvest的doc文件沒有提得很仔細,但由其原理可以推出來 google <- read_html("http://google.com",use_proxy("64.251.21.73", 8080)) #同樣的,html_session可以如法泡製 google <- html_session("http://google.com", use_proxy("64.251.21.73", 8080))
那加入proxy後,最常見的問題便時連線時間變很長,容易不穩定,此時有幾個解決方法。
使用error handler並且調整time out的設定。
1. 調整time out設定
在httr中可以設定timeout函數,設定等待回傳的時間值
2. error handler
可以使用purrr::safely或是base::tryCatch來解決拋出問題的時候,該如何處理,可以設定一個轉換proxy ip的設定,但某個proxy不穩定的時候,置換另一個,或是直接不使用proxy本地來爬取