R 使用动态表进行网络抓取
R Webscraping with dynamic tables
对于我在 R 中进行网络抓取的第一次练习,我试图弄清楚如何搜索正在出售的歌剧门票以最终找到最优惠的价格。我想做两件事:
- 创建 table 类别和价格以便能够在任何类别中搜索最佳价格
- 将 link 保存到最优惠的 http 地址(每个类别的价格)。
我 运行 遇到的问题是我只能看到 15 个观测值,但 table 可能会大得多。
library(rvest)
rmSpace <- function(x){
x<-gsub("\t","",x)
x<-gsub("\n","",x)
}
page <- url %>% html()
date <- page %>%
html_nodes(".date-tabdyn") %>%
html_text()
date <- date[-1]
date <-rmSpace(date)
category <- page %>%
html_nodes(".td_description .bold") %>%
html_text()
category<-rmSpace(category)
description <- page %>%
html_nodes(".td_description") %>%
html_text()
description <- description[-1]
description <- rmSpace(description)
price <- page %>%
html_nodes(".valeur_revente .montant-numeric") %>%
html_text()
price_normal <- page %>%
html_nodes(".valeur_faciale .montant-numeric") %>%
html_text()
links <- page %>% html_nodes(".button_eae9e5") %>% html_attr("onclick")
links <- substr(links,31,nchar(links)-2)
tab <- cbind(category, price, price_normal, date, description, links)
更新:我可以通过 rvest 得到一个不错的 table,但我还没有想出如何解决 15 视图限制。
更新 2:似乎有一个 POST 请求 return 一个 json 文件。我想我可以用它来帮助 return 更大的 table,但我不知道该怎么做。
您应该研究一下 RSelenium。您可以从以下位置获取有关 Selenium 的详细信息:http://docs.seleniumhq.org/.
本质上,Selenium 创建了一个呈现实际网页的网络浏览器,然后您可以抓取生成的 HTML。根据您使用的浏览器,您将能够处理各种有趣的网络协议。 R 中一种易于使用的网络浏览器是 phantomJS (http://phantomjs.org/)。
考虑下面的代码。首先,我指向 phantomJS 可执行文件(并且能够指定自定义代理!),我创建驱动程序并打开一个会话。 PhanomJS 之所以出色,部分原因在于它是 'headless',因此您不会看到任何额外的 windows。然后你指示你的虚拟网络浏览器导航到你的 url 并获取源。
pJS = phantom(pjs_cmd="C:/phantomjs2/bin/phantomjs.exe",extras="--proxy=localhost:3128")
remDr = remoteDriver(browserName = 'phantomjs')
remDr$open()
remDr$navigate(url)
soup = remDr$getPageSource()
总的来说,对我来说,这已经解决了 90% 的网络访问问题,就像您描述的那样。
对于我在 R 中进行网络抓取的第一次练习,我试图弄清楚如何搜索正在出售的歌剧门票以最终找到最优惠的价格。我想做两件事:
- 创建 table 类别和价格以便能够在任何类别中搜索最佳价格
- 将 link 保存到最优惠的 http 地址(每个类别的价格)。
我 运行 遇到的问题是我只能看到 15 个观测值,但 table 可能会大得多。
library(rvest)
rmSpace <- function(x){
x<-gsub("\t","",x)
x<-gsub("\n","",x)
}
page <- url %>% html()
date <- page %>%
html_nodes(".date-tabdyn") %>%
html_text()
date <- date[-1]
date <-rmSpace(date)
category <- page %>%
html_nodes(".td_description .bold") %>%
html_text()
category<-rmSpace(category)
description <- page %>%
html_nodes(".td_description") %>%
html_text()
description <- description[-1]
description <- rmSpace(description)
price <- page %>%
html_nodes(".valeur_revente .montant-numeric") %>%
html_text()
price_normal <- page %>%
html_nodes(".valeur_faciale .montant-numeric") %>%
html_text()
links <- page %>% html_nodes(".button_eae9e5") %>% html_attr("onclick")
links <- substr(links,31,nchar(links)-2)
tab <- cbind(category, price, price_normal, date, description, links)
更新:我可以通过 rvest 得到一个不错的 table,但我还没有想出如何解决 15 视图限制。
更新 2:似乎有一个 POST 请求 return 一个 json 文件。我想我可以用它来帮助 return 更大的 table,但我不知道该怎么做。
您应该研究一下 RSelenium。您可以从以下位置获取有关 Selenium 的详细信息:http://docs.seleniumhq.org/.
本质上,Selenium 创建了一个呈现实际网页的网络浏览器,然后您可以抓取生成的 HTML。根据您使用的浏览器,您将能够处理各种有趣的网络协议。 R 中一种易于使用的网络浏览器是 phantomJS (http://phantomjs.org/)。
考虑下面的代码。首先,我指向 phantomJS 可执行文件(并且能够指定自定义代理!),我创建驱动程序并打开一个会话。 PhanomJS 之所以出色,部分原因在于它是 'headless',因此您不会看到任何额外的 windows。然后你指示你的虚拟网络浏览器导航到你的 url 并获取源。
pJS = phantom(pjs_cmd="C:/phantomjs2/bin/phantomjs.exe",extras="--proxy=localhost:3128")
remDr = remoteDriver(browserName = 'phantomjs')
remDr$open()
remDr$navigate(url)
soup = remDr$getPageSource()
总的来说,对我来说,这已经解决了 90% 的网络访问问题,就像您描述的那样。