首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >抓取Javascript生成的数据

抓取Javascript生成的数据
EN

Stack Overflow用户
提问于 2013-03-11 10:45:20
回答 2查看 4.8K关注 0票数 0

我正在与世界银行合作一个项目,分析他们的采购流程。

世界银行为他们的每个项目维护网站,其中包含相关合同的链接和数据(example)。在采购页签下提供了合同相关数据。

我希望能够从该站点提取项目的合同信息,但链接和相关数据是使用嵌入式Javascript生成的,并且显示合同授予和其他数据的页面的URL似乎不遵循可识别的架构(example)。

有没有办法通过R抓取第一个示例中的浏览器渲染数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 16:58:37

主页调用javascript函数

代码语言:javascript
复制
javascript:callTabContent('p','P090644','','en','procurement','procurementId');

这里的主要内容是项目id P090644。这与所需的语言en一起作为参数传递给http://www.worldbank.org/p2e/procurement.html中的表单。

可以使用url http://www.worldbank.org/p2e/procurement.html?lang=en&projId=P090644复制此表单调用。

提取相关项目描述urls的代码如下:

代码语言:javascript
复制
projID<-"P090644"
projDetails<-paste0("http://www.worldbank.org/p2e/procurement.html?lang=en&projId=",projID)

require(XML)

pdData<-htmlParse(projDetails)
pdDescribtions<-xpathSApply(pdData,'//*/table[@id="contractawards"]//*/@href')

#> pdDescribtions
                                                                href 
#"http://search.worldbank.org/wcontractawards/procdetails/OP00005718" 
                                                                href 
#"http://search.worldbank.org/wcontractawards/procdetails/OP00005702" 
                                                                href 
#"http://search.worldbank.org/wcontractawards/procdetails/OP00005709" 
                                                                href 
#"http://search.worldbank.org/wcontractawards/procdetails/OP00005715" 

应该注意的是,excel的链接是提供的,这可能对你也有用。它们可能包含要从描述链接中删除的数据

代码语言:javascript
复制
procNotice<-paste0("http://search.worldbank.org/wprocnotices/projectdetails/",projID,".xls")
conAward<-paste0("http://search.worldbank.org/wcontractawards/projectdetails/",projID,".xls")
conData<-paste0("http://search.worldbank.org/wcontractdata/projectdetails/",projID,".xls")

require(gdata)

pnData<-read.xls(procNotice)
caData<-read.xls(conAward)
cdData<-read.xls(conData)

更新:

为了找出正在发布的内容,我们可以检查在调用javascript函数时发生了什么。使用Firebug或类似的工具截取请求头,该请求头开始于:

代码语言:javascript
复制
POST /p2e/procurement.html HTTP/1.1
Host: www.worldbank.org

并具有以下参数:

代码语言:javascript
复制
lang=en
projId=P090644

或者,我们可以在http://siteresources.worldbank.org/cached/extapps/cver116/p2e/js/script.js上检查javascript并查看函数callTabContent

代码语言:javascript
复制
function callTabContent(tabparam, projIdParam, contextPath, langCd, htmlId, anchorTagId) {
    if (tabparam == 'n' || tabparam == 'h') {
        $.ajax( {
            type : "POST",
            url : contextPath + "/p2e/"+htmlId+".html",
            data : "projId=" + projIdParam + "&lang=" + langCd,
            success : function(msg) {
                if(tabparam=="n"){
                    $("#newsfeed").replaceWith(msg);
                } else{
                    $("#cycle").replaceWith(msg);
                }
                stickNotes();
            }
        });
    } else {
        $.ajax( {
            type : "POST",
            url : contextPath + "/p2e/"+htmlId+".html",
            data : "projId=" + projIdParam + "&lang=" + langCd,
            success : function(msg) {
                $("#tabContent").replaceWith(msg);
                $('#map_container').hide();
                changeAlternateColors();
                $("#tab_menu a").removeClass("selected");
                $('#'+anchorTagId).addClass("selected");                
                stickNotes();
            }
        });
    }
}

检查函数的内容,我们可以看到它只是将相关参数发送到表单,然后更新网页。

票数 5
EN

Stack Overflow用户

发布于 2013-03-12 03:48:08

我不确定我已经理解了你问题的每一个细节。但我可以肯定的是,casperJS对javascript生成的内容非常有效。

你可以在这里看到它:http://casperjs.org/

它是用Javascript编写的,在我提供的链接上有一系列非常有用的函数。

我最近在一个个人项目中使用了它,只需几行代码就可以轻松设置。

试一试!霍普,这有帮助..。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15330393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档