在R中使用rvest跟随页面重定向

时间:2015-04-01 11:55:14

标签: r login web-scraping rvest

我是R和rvest的新手。我正在尝试使用这些来从网站(www.medicinescomplete.com)获取信息,该网站允许使用雅典学术登录系统登录。在浏览器中,当您单击雅典登录按钮时,它会将您转移到雅典登录表单。在提交用户凭据后,表单会将浏览器重定向回原始站点,但已登录。

我使用submit_form()函数将凭据提交到athens表单,这将返回200代码。但是,R不像浏览器那样遵循重定向,如果我使用jump_to()命令返回到原始站点,则它不会登录。我怀疑登录页面返回的重定向链接可能包含登录我需要的凭据,但我不知道如何找到链接并使用rvest发送它

有没有人制定出如何使用rvest通过雅典登录,或者对如何使其遵循自动重定向有任何想法?

我用来实现此目的的代码是(登录凭据已更改):

library(rvest)
library(magrittr)

url <- "https://www.medicinescomplete.com/about/"
mcsession <- html_session(url)
mcsession <- jump_to(mcsession, "/mc/athens.htm?   uri=https%3A%2F%2Fwww.medicinescomplete.com%2Fabout%2F")
athensform <- html_form(mcsession)[[1]]
athensform <-set_values(athensform, ath_uname = "xxx", ath_passwd = "yyy")
submit_form(mcsession, athensform)
jump_to(mcsession, "https://www.medicinescomplete.com/mc/bnf/current/")

我为submit_form()步骤获取了200个代码,但是跳转到最后一行的403禁止代码。

然后我将submit_form步骤传送到html()并打印出来。从我可以看出它是一个成功的登录,但在主页的正文中有一行指的是重定向回原始网站。整个页面的html太长而无法发布,但相关位似乎是:

<div style="padding: 8px;" id="logindiv">
                        <form method="POST" action="https://www.medicinescomplete.com/mc/athens">
                            Please wait while we transfer you. <br><noscript>JavaScript disabled, please<input type="submit" value="click here" style="border:none;background:none;text-decoration:underline;color:#E27B2F;">

我想知道以下这个位是否引用了一些登录密钥:

<input type="hidden" name="TARGET" value="https://www.medicinescomplete.com/about/" style="display:none"><input type="hidden" name="RelayState" value="https://www.medicinescomplete.com/about/" style="display:none"><input type="hidden" name="SAMLResponse" value="PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBEZXN...

啊哈!在页面的下方是:

<script>
window.onload = function() { document.forms[0].submit(); }
</script>

我认为该窗口旨在自动提交另一个执行帖子到原始drugscomplete.com网站的表单,以使用隐藏字段作为登录凭据进行身份验证。但是,在尝试使用此页面上的submit_form()时,我似乎无法再进一步了!我添加了以下行来尝试找出正在发生的事情:

> submit_form(mcsession, athensform) %>% html_form() %>% str()

这给出了以下输出:

Submitting with 'submit'
List of 1
 $ :List of 5
  ..$ name   : chr "<unnamed>"
  ..$ method : chr "POST"
  ..$ url    : chr "https://www.medicinescomplete.com/mc/athens"
  ..$ enctype: chr "form"
  ..$ fields :List of 4
  .. ..$ NULL        :List of 7
  .. .. ..$ name    : NULL
  .. .. ..$ type    : chr "submit"
  .. .. ..$ value   : chr "click here"
  .. .. ..$ checked : NULL
  .. .. ..$ disabled: NULL
  .. .. ..$ readonly: NULL
  .. .. ..$ required: logi FALSE
  .. .. ..- attr(*, "class")= chr "input"
  .. ..$ TARGET      :List of 7
  .. .. ..$ name    : chr "TARGET"
  .. .. ..$ type    : chr "hidden"
  .. .. ..$ value   : chr "https://www.medicinescomplete.com/about/"
  .. .. ..$ checked : NULL
  .. .. ..$ disabled: NULL
  .. .. ..$ readonly: NULL
  .. .. ..$ required: logi FALSE
  .. .. ..- attr(*, "class")= chr "input"
  .. ..$ RelayState  :List of 7
  .. .. ..$ name    : chr "RelayState"
  .. .. ..$ type    : chr "hidden"
  .. .. ..$ value   : chr "https://www.medicinescomplete.com/about/"
  .. .. ..$ checked : NULL
  .. .. ..$ disabled: NULL
  .. .. ..$ readonly: NULL
  .. .. ..$ required: logi FALSE
  .. .. ..- attr(*, "class")= chr "input"
  .. ..$ SAMLResponse:List of 7
  .. .. ..$ name    : chr "SAMLResponse"
  .. .. ..$ type    : chr "hidden"
  .. .. ..$ value   : chr "PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA"| __truncated__
  .. .. ..$ checked : NULL
  .. .. ..$ disabled: NULL
  .. .. ..$ readonly: NULL
  .. .. ..$ required: logi FALSE
  .. .. ..- attr(*, "class")= chr "input"
  .. ..- attr(*, "class")= chr "fields"
  ..- attr(*, "class")= chr "form"

我觉得这个表单中的信息应该允许我登录原始网站,但我不太明白怎么做!不幸的是,当我再次使用此表单尝试submit_form()函数时,它似乎无法正常工作。我试过这个:

submit_form(mcsession, athensform) %>% html_form() %>% submit_form(mcsession, .) %>% html()

得到了这个:

Submitting with 'submit'
Submitting with ''
Error in if (!(submit %in% names(submits))) { : 
  argument is of length zero

1 个答案:

答案 0 :(得分:2)

很可能与this issue绑定,导致httr无法在重定向上发出正确的GET查询。

虽然有点难以猜测,因为您缺少可重现的示例或查询的完整详细输出。

解决方法是使用以下命令阻止重定向:

rvest::submit_form(...,
                   httr::config(followlocation = FALSE))