使用R中的phantomJS来抓取动态加载内容的页面

背景我正在使用rvest从R中的一些网站上抓取产品信息。 这适用于除了一个网站之外的所有内容,其中的内容似乎是通过angularJS(?)动态加载的,因此不能通过URL参数迭代加载(就像我为其他网站所做的那样)。 具体url如下:

http://www.hornbach.de/shop/Badarmaturen/Waschtischarmaturen/S3584/artikelliste.html

请记住,我的计算机上没有管理员权限,只能实现不需要或只需要一次性授予管理员权限的解决方案

期望的输出最后R中的表格包含产品信息(例如标签,价格,评级)=>在这个问题中,我纯粹需要帮助来动态加载和存储网站; 我可以自己处理R中的后处理。 如果你能把我推向正确的方向,那绝对是伟大的; 也许下面列出的方法之一是在正确的轨道上,但我似乎无法将这些方法转移到指定的网站。

目前的方法我发现phantomJS作为无头浏览器,afaik应该能够处理这个问题。 我对Java Script几乎一无所知,并且语法不同(至少对我来说)很大程度上来自于我更习惯的语言(R,Matlab,SQL)我真的很难实现其他可能在其他地方工作的方法我的代码。 基于这个例子 (非常感谢)我设法使用以下代码从第一个显示的页面中检索至少信息:

R:

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_attr('href') 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); } 

什么不起作用//研究当这段代码从第一页检索信息时,我需要遍历所有x产品页面。 我尝试使用以下示例扩展上面的代码:

无法使用r中的phantomjs刮取多个页面

[用phantomjs刮动态加载页面] [3]

[Web抓取动态加载R中的数据] [4]

这些例子让我想到了这个想法

  • 点击“下一页”按钮
  • 或以某种方式注入正确的分页值

    1. 点击“下一页”按钮

这看起来如下

  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中的小工具检查器来检索按钮名称,但也可能是错误的:

 right 
  1. 在加载时更改分页参数

我试着在这里给出给定的例子。将变量传递给page.evaluate – PhantomJS

而且还得到了一个从未在R中结束的剧本

附加说明看起来我只允许发布两个链接,所以不幸的是我无法链接我研究和测试的所有来源。

我很清楚这是一次巨大而混乱的信息,如果你能帮助我改进/更好地构建我的问题,请告诉我。 我会尽力做出回应,并为您提供所需的任何帮助。

我将PhantomJS代码拆分为两部分,避免了错误消息。 我非常有信心可以先阅读并存储网站,然后点击“下一页”按钮并输出新的url,但不幸的是,如果没有错误消息,这就无法解决。

以下R代码是最内部的抓取循环(从一个子子类的页面检索信息,相应地调用/更改PhantomJS脚本)。

  for (i3 in 1:num_prod_pages) { system('phantomjs readhtml.js') # return html of current page via PhantomJS ### Use Rvest to scrape the downloaded website. html_filename <- paste0(as.character(i3), '.html') # file generated in PhantomJS readhtml.js web <- read_html(html_filnamee) content <- html_nodes(web, 'div.article-pricing') # %>% html_attr('href') content <- html_text(content) %>% as.data.frame() ### generate URL of next page url_i3 <- capture.output(system("phantomjs nextpage.js", intern = TRUE)) %>% .[length(.)] %>% # last line of output contains str_sub(str_locate(., 'http')[1], -2) # cut '[1] \' at start and ' \" ' at end # Adapt PhantomJS scripts to new url lines <- readLines("readhtml.js") lines[2] <- paste0("var url ='", url_i3 ,"';") lines[11] <- paste0(" fs.write('", as.character(i3), ".html', page.content, 'w');") writeLines(lines, "readhtml.js") lines <- readLines("nextpage.js") lines[2] <- paste0("var url ='", url_i3 ,"';") writeLines(lines, "nextpage.js") } 

以下PhantomJS代码“readhtml.js”代码在本地存储当前URL的网站

 var webPage = require('webpage'); var url ='http://www.hornbach.de/shop/Badarmaturen/S476/artikelliste.html'; var fs = require('fs'); var page = webPage.create(); var system = require('system'); //page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0' page.settings.userAgent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' page.open(url, function(status) { if (status === 'success') { fs.write('1.html', page.content, 'w'); console.log('htmlfile ready'); phantom.exit(); } }) 

以下PhantomJS代码“nextpage.js”代码单击“下一页”按钮并返回新URL

 var webPage = require('webpage'); var url ='http://www.hornbach.de/shop/Badarmaturen/S476/artikelliste.html'; var fs = require('fs'); var page = webPage.create(); var system = require('system'); page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0'; page.open(url, function(status) { if (status === 'success') { page.evaluate(function() { document.querySelector('a.right:nth-child(3)').click(); }); setTimeout(function() { var new_url = page.url; console.log('URL: ' + new_url); phantom.exit(); }, 2000); }; }); 

总而言之,并不是很优雅,但缺少其他输入我关闭这个,因为它没有任何错误消息