杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。
最近在练习R语言与Python的网络数据抓取内容,遇到了烦人的验证码问题,走了很多弯路,最终总算解决了。
在分享这篇文章之前,只想感慨一声,虽然Python拥有更为完善的爬虫生态和多如牛毛的爬虫分享课程,但是貌似这些大部分内容,使用R语言中的RCurl+httr都可以做到,但是可惜的利用R语言学习爬虫的爱好者与Pythoner相比,实在是太少了,R语言的高阶爬虫教程凤毛麟角,只能一点一点儿在stackflow上面搜罗整理。
希望我的这一篇案例能给大家带来一点儿可借鉴的思路。
R
library("RCurl")
library("XML")
library("dplyr")
library("ggplot2")
library("ggimage")
使用爬虫登录教务系统,最大的困难是验证码识别。通常来讲,你首次访问教务处的登录页,会激活验证码请求,输入验证码和账号密码,点击登录按钮则激活一个提交数据的POST请求。前后是在同一个进程中处理的,所以你不用担心前后cookie不一致的问题。
可是如果是使用爬虫来登录,你需要使用cookie管理功能,自动记忆登录时的cookie,让两个请求绑定在一个进程里,这样后续所有的请求都会自动复用第一次登录的cookie,你可以完成所有子网页的请求与遍历。
以下是教务处的登录和验证码请求地址:
login<-"http://202.199.165.193/loginAction.do"
Codein<-"http://202.199.165.193/validateCodeAction.do"
#构造报头:
header = c(
"Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Connection"="keep-alive",
"User-Agent"="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
"Content-Type"="application/x-www-form-urlencoded"
)
#构造账号、密码、验证码(留空)构成的表单体
payload<-c(zjh="*******",mm="*****",v_yzm="")