老板要搞大文章,看师兄在数据上挣扎,就抽空写个简单的R代码抓取网页数据。
本来是想上12306直接抓列车时刻表来着,但是那个有验证码,不好搞。所以上火车票抓数据好了。
基本的代码如下,等有空了再来更新数据库存储,遍历等问题。
require(RCurl)
require(XML)
myHttpheader <- c(
"User-Agent"="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 ",
"Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language"="zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
"Connection"="keep-alive",
"Accept-Charset"="GB2312,utf-8;q=0.7,*;q=0.7",
"Cache-Control"="max-age=0"
)
cHandle <- getCurlHandle(httpheader = myHttpheader)
d <- debugGatherer()
from <- paste(paste('%',unlist(iconv('北京',to='GB2312',toRaw=TRUE)),sep=''),collapse='')
to <- paste(paste('%',unlist(iconv('上海',to='GB2312',toRaw=TRUE)),sep=''),collapse='')
# 这里是关键,得到中文字符GB2312编码的URL encode
url <- paste("http://search.huochepiao.com/chaxun/result.asp?txtChuFa=",
from,"&txtDaoDa=",to,"&Submit=%d5%be%d5%be%b2%e9%d1%af",sep="")
webpage <- getURL(url, .opts = list(debugfunction=d$update,verbose = TRUE), curl=cHandle, .encoding='UTF-8')
#webpage <- iconv(webpage,"GB2312","UTF-8") # 如果这里先做了编码转换,后面htmlParse解析的时候就不用设置编码了
data_html <- htmlParse(webpage,asText=TRUE, encoding='GB2312')
data_final <- readHTMLTable(data_html, which = 6, header = TRUE) # 读取第6个表格
注:
- 填写表单
getForm("http://alexa.ip138.com/post/search.asp",zip="518100") postForm("http://www.shenzhenpost.com.cn/services/postcode/civilcode.asp", "key"="武汉","B1"="查 询",way="add")
- 可以用firefox上的live http header插件分析一下http header以及post content。