从需要使用 R/Rvest 登录的 javascript 网站抓取

时间:2021-05-31 17:41:00

标签: javascript r web-scraping rvest rselenium

我正在尝试使用 R/R Studio 从需要登录并使用 javascript 的网站中抓取信息。就目前而言,我的代码目前产生输出:'NA' 或 'NA_character' 用于抓取信息,这是不正确的(应该是数字或字符文本)。

我过去曾成功地从非登录网站上抓取过,但担心这个网站在很多层面上都更先进。我读过,如果网站使用 javascript,这会改变抓取过程。然而,我对我可以使用的选项感到不知所措,并想咨询 StackOverflow 专家。此资源 (https://github.com/yusuzech/r-web-scraping-cheat-sheet/blob/master/README.md#rvest7.3) 推荐了三个选项:

  1. 在 R 中执行 javascript 2) 使用开发者工具 3) 使用 RSelenium

我尝试过选项 1 和选项 2。选项 1 似乎依赖于从抓取过程中接收 javascript 输出,而我的抓取过程中的“NA”“NA_character”输出并未提供该输出。我已经尝试了选项 2(开发工具的新手),但发现我的直觉告诉我的东西是不够的(与教程不匹配,缺少很多抢手的关键字)。

我很想知道这个社区将如何处理这个问题并从这个特定的网站上抓取。任何见解和指导将不胜感激 - 已经在这方面花费了大量时间,并决定是时候与他人联系了。感谢您抽出宝贵时间。

#scrape link
link_of_interest <- "https://www.cdp.net/en/formatted_responses/responses?campaign_id=70692136&discloser_id=857156&locale=en&organization_name=Goldman+Sachs+Group+Inc.&organization_number=7599&program=Investor&project_year=2020&redirect=https%3A%2F%2Fcdp.credit360.com%2Fsurveys%2F6sc15v4h%2F92645&survey_id=68887525"

#login
login <- "https://www.cdp.net/en/users/sign_in"
pgsession<- html_session(login)
pgform <- html_form(pgsession)
login_form <- pgform[[1]]
login_form
filled_form <- set_values(login_form, "user[email]" = "*******", "user[password]" = "******")
filled_form
logged_in_session <- submit_form(pgsession, filled_form)
scrape_session <- logged_in_session %>% 
  (jump_to(pgsession, link_of_interest))

#scrape: 
scrape_tag <- '.ndp_formatted_response__header+ .ndp_formatted_response__question .ndp_formatted_response__value'  #example tag
scraped_information <- scrape_session %>% html_node(scrape_tag) %>% html_text() 

其他注意事项:我不确定“pgform[[1]]”中的括号和数字实际上是做什么的,但我相信我正确使用它们。

1 个答案:

答案 0 :(得分:0)

据我所知,最简单的方法是,如果你成功打开它,就是使用 RSelenium 和以下功能:

首先,您必须找到放置登录名和密码的元素

```
Login <- remDr$findElement('css selector', 'CSS-login')
Password <- remDr$findElement('css selector', 'CSS-password')
# You can also, of course, use XPath
```

然后您使用以下输入您的信息

```
Login$sendKeysToElement(list("YourLogin"))
Password$sendKeysToElement(list("YourPassword"))
```

然后你必须找到登录按钮的位置并点击它

```
frames <- remDr$findElements("css selector", 'CCS-LoginInButton')

frames[[1]]$clickElement()
```

那么您应该已连接。