用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代理偷偷给文章刷阅读量http://suo.im/4Vk5Ob
爬的目标网址是国内的西刺高匿代理,很早就听大佬们说免费的代理没有好货,因为匿名代理很多有时限,在加上首页的可能很多开发者都在用,所以即便你爬再多,可用的也有限。我一共爬了前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地址ttt端口t存活时间tt验证时间")
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],"tt",port[j],"tt",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个,痛哭流涕!!!
往期案例数据请移步本人GitHub: https://github.com/ljtyduyu/DataWarehouse/tree/master/File
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- yii2 上传图片的示例代码
- DataFrame.groupby()所见的各种用法详解
- keras训练曲线,混淆矩阵,CNN层输出可视化实例
- Pandas缺失值2种处理方式代码实例
- ThinkPHP5 的简单搭建和使用详解
- PyInstaller运行原理及常用操作详解
- php使用curl模拟浏览器表单上传文件或者图片的方法
- Python轻量级web框架bottle使用方法解析
- 详解在YII2框架中使用UEditor编辑器发布文章
- 基于python和flask实现http接口过程解析
- Python xpath表达式如何实现数据处理
- Python脚本破解压缩文件口令实例教程(zipfile)
- 使用keras实现Precise, Recall, F1-socre方式
- Python Django搭建网站流程图解
- Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)