我正试图从网站上抓取一些数据。这是我通常在Perl中做的事情,但我真的想让自己脱离Perl。 (我不是在贬低Perl;它是一个很有价值的工具,但是我十多年来仍然对这种语言的困难感到苦恼。)因为我的需求很简单而且性能对我来说很少是一个问题,我想要将我的网络抓取转移到R.我知道一些R,但我从未使用过RCurl或类似的库。
任务是抓取公开数据的数据库。由于我不知道如何传递参数,这个问题很复杂,因为我只是在查看JS源代码并试图找出要包含在RCurl postForm请求中的内容。下面的代码不会引发任何明显的错误,但它也不会返回任何有用的内容。
Q值。我做错了什么?
[编辑:反映建议的更改,但尚未解决]
require(RCurl)
## -----------> Form:
## http://jamaserv.jama.or.jp/newdb/eng/index.html
## -----------> Result:
## http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html
#POST /newdb/eng/prod4/prod4TsMkEntry.html makerCd=5&additionBase=1&additionInterval=1&chkSelCnd3=0&car4Cd=100005&termFrom=201103&termTo=201203&prod4TsMkEntryForm%3AdoAction=Server&prod4TsMkEntryForm%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntryForm
#POST /newdb/eng/prod4/prod4TsMkEntry.html?pass chkSelCnd3=0&prod4TsMkEntryForm%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntryForm&makerCd=5&additionBase=1&termTo=201203&prod4TsMkEntryForm%3AdoAction=Server&additionInterval=1&termFrom=201103&car4Cd=100005
x <- postForm('http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html?pass',
chkSelCnd3 = '0',
'prod4TsMkEntryForm/eng/prod4/prod4TsMkEntry.html' = 'prod4TsMkEntryForm',
makerCd = '5',
additionBase = '1',
termTo = '201203',
'prod4TsMkEntryForm:doAction' = 'Server',
additionInterval = '1',
termFrom = '201103',
car4Cd = '100005',
.opts = curlOptions(
referer = 'http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html',
verbose = TRUE,
header = TRUE,
followLocation = TRUE,
useragent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'
)
)
使用浏览器时,表单如下所示:
以上设置返回(在单独的页面上):
答案 0 :(得分:4)
您可以添加.opts
参数,
指定引用者
(有些网站拒绝查询,如果来自外部),
用户代理(某些网站拒绝未知的用户代理)
并要求遵循重定向(这就是为什么你的结果是空的)。
如果您添加verbose=TRUE
,则会提供更多信息:
初始POST查询实际上失败了,
在发送表单内容之前,
和RCurl尝试GET查询,
它会返回一条错误消息
(“未选择类型(机动车辆)”)。
x <- postForm(
...,
.opts = curlOptions(
referer="http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html",
verbose = TRUE,
followLocation = TRUE,
useragent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
)
)
答案 1 :(得分:1)
这最初是一个更复杂的问题,它涉及服务器端的Javascript和各种各样的东西。使用我在这个问题中使用的简单方法似乎不可行。所以,回答我自己的问题并继续......