進階R語言爬蟲:在rvest或是httr中使用proxy和timeout 連線問題的處理

在撰寫爬蟲程式的時候,有一個很重要的問題要注意便是當要爬取特定網站的大量資料時,通常網站管理員會對你的爬蟲做“處理”,針對你的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本地來爬取

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s