您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何用R語言擼了一個簡易代理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
最近正在刻苦的學習爬蟲,陸陸續續的學習了正則表達式、xpath、css表達式,基本可以勝任R語言中的RCurl+XML、httr+rvest組合爬蟲的需求,對GET請求和POST請求的構造和表單提交以及瀏覽器抓包、模擬登陸、異步加載也做了一些梳理,因為爬蟲知識的通用性,所以在入門Python階段直接就開始練習urllib+lxml、requests+BeautifulSoup。
爬蟲的入門也算有了一點兒小小的心得,下一步計劃在不斷練習鞏固現有知識的同時、對服務器的反反爬進行探索,這里涉及到如何使用隨機agent、如何構造匿名代理IP以及如何使用多進程,要走的路還有很長。
之前一直有計劃去爬豆瓣熱門影視劇短評,試過好幾次,豆瓣短評頁是需要登陸后查看的,而且熱門影視劇的短評通常都不會少于10000+頁,這樣頻次的請求稍有不慎就會被封ip,所以一直在研究如何友好、溫和的解決這個問題。
前幾天看到Python愛好者社區的大嬸們用Python寫了代理池的代碼,就想著用R語言也擼一個,那個代碼提供了多進程檢測代理IP有效性的方案,可是我對R語言的多進程還了解不夠,只能用笨辦法一點兒一點兒檢測,很耗時,雖然笨一點,但是最后也算運行成功了。
爬取IP代理偷偷給文章刷閱讀量
爬的目標網址是國內的西刺高匿代理,很早就聽大佬們說免費的代理沒有好貨,因為匿名代理很多有時限,在加上首頁的可能很多開發者都在用,所以即便你爬再多,可用的也有限。我一共爬了前6頁,用RCul+XML結合,以百度搜索首頁為目標網址,簡單篩選了一下,600個ip只篩了13個可用的~_~。
不過話又說回來了,西刺一共有2000+頁代理ip,一共加起來差不多20萬+個代理,如果你不嫌麻煩,可以慢慢搞一遍,不過要友好一點兒!想要好用的,據說有錢能使磨推鬼!
以下是我個人使用R語言仿照上面那篇文章的思路寫的一個簡易IP代理抓取與檢測代碼。
加載擴展包:
library("RCurl") library("XML") library("dplyr")
獲取可用User-Agent
#在這個網頁上找到了一些可用的user-agent:
GetUserAgent<-function(){
url<-"http://www.atool.org/useragent.php"
content<-url %>% getURL(encoding='utf-8') %>% htmlParse()
UserAgent<-content %>% xpathSApply("//ul[@class='new_tools_list']/li[@class='green']",xmlValue) %>% .[1:(length(.)-1)] return(UserAgent)
}
###獲取UA(user-agent)
myuseragent<-GetUserAgent()
#生成隨機UA
RandomUA<-function() sample(myuseragent,1,replace=TRUE)
RandomUA()
爬取代理列表:
getProxies<-function(){
init_proxies=c()
for (i in 1:6){
print("####")
print(paste0("####爬取第",i,"頁####"))
print("####")
print("IP地址\t\t\t端口\t存活時間\t\t驗證時間")
url <- paste0("http://www.xicidaili.com/nn/",i)
headers <- c("User-Agent"=RandomUA())
#設置錯誤記錄
d <- debugGatherer()
#構造curl句柄收集登錄信息,開啟cookiefile管理器:
chandle <- getCurlHandle(debugfunction=d$update,followlocation=TRUE,cookiefile="",verbose = TRUE)
result = tryCatch({
content <- url %>% getURL(curl=chandle,httpheader=headers,.encoding='utf-8')
}, error = function(e) {
cat("ERROR :",conditionMessage(e),"\n")
})
myproxy <- content %>% htmlParse()
#提取IP地址、端口、存活時間、驗證時間
ip_addrs <- myproxy %>% xpathSApply('//tr/td[2]',xmlValue) #IP地址
port <- myproxy %>% xpathSApply('//tr/td[3]',xmlValue) #端口
sur_time <- myproxy %>% xpathSApply('//tr/td[9]',xmlValue) #存活時間
ver_time <- myproxy %>% xpathSApply('//tr/td[10]',xmlValue) #驗證時間
for (j in 1:length(ip_addrs)){
ip <- paste0(ip_addrs[j],":",port[j])
init_proxies <- c(init_proxies,ip)
#輸出ip
print(paste0(ip_addrs[j],"\t\t",port[j],"\t\t",sur_time[j],"\t",ver_time[j]))
}
} return (init_proxies)
}
###獲取代理IP:
myproxies<-getProxies()
檢驗代理IP是否有效:
testProxy <- function(myproxies){
tmp_proxies = c()
tarURL <- "https://www.baidu.com/"
headers <- c("User-Agent"=RandomUA())
d <- debugGatherer() for (ip in myproxies) {
#構造curl句柄收集登錄信息,開啟cookiefile管理器:
chandle <- getCurlHandle(debugfunction=d$update,followlocation=TRUE,cookiefile="",proxy=ip,verbose = TRUE)
Error <- try(tarURL %>% getURL(curl=chandle,httpheader=headers,.opts=list(maxredirs=2,ssl.verifypeer=FALSE,verbose=TRUE,timeout=5)),silent=TRUE)
if(!'try-error' %in% class(Error)){
tmp_proxies<-c(tmp_proxies,ip)
} else {
next
}
Sys.sleep(sample(1:2,1,replace=TRUE))
}
return(tmp_proxies)
}
###返回有效代理:
UsefulProxy <- sapply(myproxies,testProxy) %>% unlist %>% na.omit() %>% unname()
600個ip,只篩選除了寥寥無幾的13個,痛哭流涕!!!
看完上述內容,你們對如何用R語言擼了一個簡易代理有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。