首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rvest登录Yahoo

使用rvest登录Yahoo
EN

Stack Overflow用户
提问于 2016-03-29 03:18:50
回答 1查看 789关注 0票数 2

最近,雅虎将他们的身份验证机制改为两步一。所以现在,当我登录雅虎网站时,我输入我的用户名,然后它会要求我打开我的雅虎移动应用程序,给它一个代码。或者,你可以让它通过电子邮件或短信来解决这个问题。其结果是,过去用于程序化登录雅虎网站的代码不再起作用。这段代码只是重定向到登录表单。我尝试过在使用和不使用用户代理字符串的情况下,以及在表单值中使用和不使用countrycode=1。我可以在查看我的移动应用程序后输入代码,但它不会将我转到输入该代码的页面。现在我们怎么用R登录雅虎呢?

代码语言:javascript
复制
url <- "http://mail.yahoo.com"
uastring <- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"

s <- rvest::html_session(url, httr::user_agent(uastring))
s_form <- rvest::html_form(s)[[1]]
filled_form <- rvest::set_values(s_form, username="myusername", 
                                 passwd="mypassword")
out <- rvest::submit_form(session=s, filled_form, submit="signin",
                          httr::add_headers("Content-Length"=0))
EN

回答 1

Stack Overflow用户

发布于 2016-04-05 22:38:25

好吧,我在这里偶然发现了答案。我使用httr::add_headers("Content-Length"=0)来响应rvest将抛出的警告:Warning message: In request_POST(session, url = url, body = request$values, encode = request$encode, : Length Required (HTTP 411).

事实证明,尽管有警告,但一切正常,实际上,如果我添加content-length标头,登录就会失败。因此,我登录yahoo的代码最终如下所示:

代码语言:javascript
复制
  username <- "some_username@yahoo.com"
  league_id <- "some league id to complete the fantasy football url"

  uastring <- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"
  url <- "http://football.fantasysports.yahoo.com/f1/"
  url <- paste0(url, league_id)

  s <- rvest::html_session(url, httr::user_agent(uastring))  
  myform <- rvest::html_form(s)[[1]]
  myform <- rvest::set_values(myform, username=username)
  s <- suppressWarnings(rvest::submit_form(s, myform, submit="signin"))
  s <- rvest::jump_to(s, s$response$url)
  myform <- rvest::html_form(s)[[1]]
  if("code" %in% names(myform$fields)){
    code <- readline(prompt="In your Yahoo app, find and click on the Account Key icon.\nGet the 8 character code and\nenter it here: ")
  }else{
    print("Unable to login")
    return(NULL)
  }
  myform <- rvest::set_values(myform, code=code)  
  s <- suppressWarnings(rvest::submit_form(s, myform, submit="verify"))
  if(grepl("authorize\\/verify", s$url)){
    print("Wrong code entered, unable to login")
    return(NULL)
  }else{
    print("Login successful")
  }
  s <- rvest::jump_to(s, s$response$url)

这是一个两步的过程..。提交您的用户名,然后转到您的yahoo应用程序获取登录码。不需要雅虎密码。我使用readline获取登录码。看起来效果很好。在完成登录后,我可以抓取我的梦幻足球数据。非常奇怪的是,要求提供内容长度标题的警告会将您引向一条不起作用的路径。顺便说一句,同样的情况也适用于尝试登录到google。你必须忽略这个警告,它工作得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36269476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档