我想学习如何使用RCurl(或其他合适的R包,如果我错了RCurl是正确的工具)来自动在数据文件中提交的搜索字词,以网络的形式,并把搜索结果的过程.我正在处理的具体问题如下:
我有一个数据文件给出了几辆汽车的车牌号码(LPN)和车辆识别号码(VIN).汽车的加利福尼亚部门(DMV)有让您输入LPN和VIN的最后五位数字的网页搜索形式,它返回的车辆牌照费,2010年或2009年(VLF)支付(有一个选择在输入表格上也是如此).(仅供参考:这是一个研究项目,用于查看车辆制造,型号和型号年份的VLF支付分布情况)
我可以通过手动输入每辆车数据的繁琐过程,然后手动将结果输入电子表格.但这是21世纪,我想尝试自动化这个过程.我想编写一个脚本,将每个LPN和VIN提交到DMV Web表单,然后将结果(VLF支付)放入我的数据文件中的新VLF变量中,重复执行此操作直到它到达列表末尾LPN和VIN.(顺便说一句,DMV网络表格就在这里:https: //www.dmv.ca.gov/FeeCalculatorWeb/vlfForm.do).
我的计划是使用getHTMLFormDescription()(在RHTMLForms包),找出输入字段的名称,然后使用getForm()或postForm()(在RCurl包)来检索输出.不幸的是,我在第一步陷入困境.这是我使用的R命令和输出:
> forms = getHTMLFormDescription("https://www.dmv.ca.gov/FeeCalculatorWeb/vlfForm.do")
Error in htmlParse(url, ...) :
File https://www.dmv.ca.gov/FeeCalculatorWeb/vlfForm.do does not exist
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于R来说相对较新,而且几乎全新的HTTP和网络抓取,我不知道下一步该怎么做.
首先,有谁知道为什么我的getHTMLFormDescription()调用出错?或者,还有另一种方法可以找出输入字段的名称吗?
其次,您能否建议一些示例代码来帮助我开始实际提交LPN和VIN并检索输出?getForm()或postForm()是正确的方法还是我应该做其他事情?如果要提交一些真正的LPN-VIN组合会有所帮助,这里有三个:
LPN VIN
5MXH018
30135 4TOL562
74735 5CWR968 11802
最后,因为你可以看到我是一个完整的新手,你是否有我需要学习的建议,以便熟练掌握这种网络抓取以及如何去学习它(用R或另一种语言) )?对网站,书籍,列表服务器,其他StackOverflow问题等的具体建议会很棒.
谢谢你的帮助.
除了daroczig和Rguy的建议之外,还有一小段代码可以自动完成将数据提取到数据框中的整个过程.
# construct sample data frame with lpn, vpn and years
lpn = rep(c('5MXH018', '4TOL562', '5CWR968'), 2);
vpn = rep(c('30135', '74735', '11802'), 2);
year = c(rep(2009, 3), rep(2010, 3));
mydf = data.frame(lpn, vpn, year);
# construct function to extract data for one record
get_data = function(df){
library(XML);
# root url
root = 'http://www.dmv.ca.gov/wasapp/FeeCalculatorWeb/vlfFees.do?method=calculateVlf&su%C2%ADbmit=Determine%20VLF'
# construct url by adding lpn, year and vpn
u = paste(root, '&vehicleLicense=', df$lpn, '&vehicleTaxYear=',
df$year, '&vehicleVin=',
df$vpn, sep = "");
# encode url correctly
url = URLencode(u);
# extract data from the right table
data = readHTMLTable(url)[[5]];
}
# apply function to every row of mydf and return data frame of results
library(plyr)
mydata = adply(mydf, 1, get_data);
# remove junk from column names
names(mydata) = gsub(':\302\240\302\240', '', names(mydata))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11309 次 |
| 最近记录: |