出身背景
我目前正在使用rvest从R的一些网站上抓取产品信息。这适用于除一个网站外的所有网站,其中内容似乎是通过angularJS(?)动态加载的,因此无法通过URL参数等迭代加载(就像我对其他网站所做的那样)。具体url如下:
http://www.hornbach.de/shop/Badarmaturen/Waschtischarmaturen/S3584/artikelliste.html
期望输出
最后,在R中的表格中显示产品信息(例如标签、价格、评级)=>不过,在这个问题上,我完全需要帮助来动态加载和存储网站;我可以自己处理R中的后处理。
如果你能把我推向正确的方向,那太好了;也许我下面列出的方法之一是正确的,但我似乎无法将它们转移到指定的网站。
当前方法
我发现phantomJS是一款无头浏览器,afaik应该能够处理这个问题。我对Java脚本几乎一无所知,语法与我更熟悉的语言(R、Matlab、SQL)有很大不同(至少对我来说),我真的很难实现其他地方提出的可能在我的代码中工作的方法。
this example
(非常感谢)我使用以下代码从第一个显示的页面中至少检索到了信息:
require(rvest)
## change Phantom.js scrape file
url <- 'http://www.hornbach.de/shop/Badarmaturen/Waschtischarmaturen/S3584/artikelliste.html'
lines <- lines <- readLines("scrape_final.js")
lines[1] <- paste0("var url ='", url ,"';")
writeLines(lines, "scrape_final.js")
## Download website
system("phantomjs scrape_final.js")
### use Rvest to scrape the downloaded website.
web <- read_html("1.html")
content <- html_nodes(web, 'div.paging-indicator')# %>% html_attr('href')
content <- html_text(content) %>% as.data.frame()
以及相应的PhantomJS脚本:
var url ='http://www.hornbach.de/shop/Badarmaturen/Waschtischarmaturen/S3584/artikelliste.html';
var page = new WebPage()
var fs = require('fs');
page.open(url, function (status) {
just_wait();
});
function just_wait() {
setTimeout(function() {
fs.write('1.html', page.content, 'w');
phantom.exit();
}, 2500);
}
什么不起作用//研究
Unable to scrape multiple pages using phantomjs in r
-
单击“下一页”按钮
-
或者以某种方式注入正确的分页值
-
单击“下一页”按钮
var url ='http://www.hornbach.de/shop/Badarmaturen/Waschtischarmaturen/S3584/artikelliste.html';
var page = require('webpage').create();
var fs = require('fs');
page.open(url, function (status) {
age.open(url, function() {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.evaluate(function() {
$("paging-btn right").click();
just_wait();
});
phantom.exit()
});
});
function just_wait() {
setTimeout(function() {
fs.write('1.html', page.content, 'w');
phantom.exit();
}, 2500);
}
但由于语法不好,可能还有其他原因,这并没有给我带来任何帮助。
从R调用这个脚本并不会产生错误,不幸的是,它只运行了很长时间,所以我必须退出它(而工作脚本只需要几秒钟)。
我使用firefox的gadget inspector来检索按钮名称,但这也可能是错误的:
<a class="paging-btn right rel="next" ng-click="goToNextPage()"
ng-hide="articleData.pageNumber == articleData.pageCount"
href="javascript:void(0);">right</a>
-
我试着在这里学习给定的例子
Passing variable into page.evaluate - PhantomJS
其他注释
看起来我只能发布两个链接,所以不幸的是,我无法链接我研究和测试的所有来源。
我很清楚这是一个巨大而混乱的信息,如果你能帮助我改进/更好地组织我的问题,请让我知道。我会尽我所能做出回应,为你提供任何需要帮助的东西。