使用Rvest登录网站进行刮擦时出现403错误

mks*_*212 6 session r web-scraping http-status-code-403 rvest

我试图在需要登录的网站上抓一页,并且一直在收到403错误.

我已经为我的网站修改了这2个帖子的代码,使用rvest或httr登录网页上的非标准表单以及如何重用会话以避免在使用rvest进行重复登录时重复登录?

library(rvest)
pgsession <- html_session("https://www.optionslam.com/earnings/stocks/MSFT?page=-1")
pgform <- html_form(pgsession)[[1]]
filled_form <- set_values(pgform, 'username'='user', 'password'='pass')
s <- submit_form(pgsession, filled_form) # s is your logged in session
Run Code Online (Sandbox Code Playgroud)

代码运行时,我收到以下消息:

Submitting with 'NULL'
Warning message:
In request_POST(session, url = url, body = request$values, encode = request$encode,  :
  Forbidden (HTTP 403).
Run Code Online (Sandbox Code Playgroud)

我也通过这种方式运行代码,通过在注释中将user_agent更新为RS建议,但是,我收到与上面相同的错误.

library(rvest)
library(httr)
uastring <- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"
pgsession <- html_session("https://www.optionslam.com/earnings/stocks/MSFT?page=-1", user_agent(uastring))
pgform <- html_form(pgsession)[[1]]
filled_form <- set_values(pgform, 'username'='user', 'password'='pass')
s <- submit_form(pgsession, filled_form) # s is your logged in session
Run Code Online (Sandbox Code Playgroud)

如果您在未登录的情况下拉出页面,它会在文本下方的右下方显示一些数据表:"可用的收入事件:65"

登录后,它将显示所有65个事件,表格将填入我想要下载的内容.我已经拥有了所需的所有代码,但我只是在登录部分.

谢谢您的帮助.

mks*_*212 5

根据RS的建议,我用RSelenium登录成功。

mac 用户使用 chrome 或 phantom 的快速说明。我正在运行 El Capitan,因此在让 mac 识别两个 bin 文件的路径时遇到了一些问题。相反,我将 bin 文件移动到 /usr/local/bin 并且它们运行没有问题。

以下是执行此操作的代码:

library(RSelenium)
RSelenium::startServer()
remDr <- remoteDriver(browserName = "chrome")
remDr$open()
appURL <- 'https://www.optionslam.com/accounts/login/'
remDr$navigate(appURL)
remDr$findElement("id", "id_username")$sendKeysToElement(list("user"))
remDr$findElement("id", "id_password")$sendKeysToElement(list("password", key='enter'))

appURL <- 'https://www.optionslam.com/earnings/stocks/MSFT?page=-1'
remDr$navigate(appURL)
Run Code Online (Sandbox Code Playgroud)

这也可以用幻影来完成,

library(RSelenium)

pJS <- phantom() # start phantomjs

appURL <- 'https://www.optionslam.com/accounts/login/'
remDr <- remoteDriver(browserName = "phantomjs")
remDr$open()
remDr$navigate(appURL)
remDr$findElement("id", "id_username")$sendKeysToElement(list("user"))
remDr$findElement("id", "id_password")$sendKeysToElement(list("password", key='enter'))

appURL <- 'https://www.optionslam.com/earnings/stocks/MSFT?page=-1'
remDr$navigate(appURL)
Run Code Online (Sandbox Code Playgroud)