0

私は世界銀行と一緒に調達プロセスを分析するプロジェクトに取り組んでいます。

WBは、各プロジェクトのWebサイトを維持しており、発行された関連する契約のリンクとデータが含まれています()。契約関連のデータは、[調達]タブで利用できます。

このサイトからプロジェクトの契約情報を取得できるようにしたいのですが、リンクと関連データは埋め込みJavascriptを使用して生成されており、契約賞やその他のデータを表示するページのURLは識別可能なスキーマに従っていないようです()。

最初の例でブラウザでレンダリングされたデータをRを介してスクレイプする方法はありますか?

4

2 に答える 2

5

メインページはjavascript関数を呼び出します

javascript:callTabContent('p','P090644','','en','procurement','procurementId');

ここでの主なものはプロジェクトIDP090644です。これは、必要な言語とともに、パラメータとしてhttp://www.worldbank.org/p2e/procurement.htmlenのフォームに渡されます。

このフォーム呼び出しは、URLhttp ://www.worldbank.org/p2e/procurement.html? lang=en&projId= P090644で複製できます。

関連するプロジェクトの説明のURLを抽出するコードは次のとおりです。

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リンクが提供されていることに注意してください。説明リンクからスクラップする予定のデータが含まれている場合があります

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または同様のものを使用して、以下を開始するリクエストヘッダーをインターセプトします。

POST /p2e/procurement.html HTTP/1.1
Host: www.worldbank.org

とパラメータがあります:

lang=en
projId=P090644

または、 http: //siteresources.worldbank.org/cached/extapps/cver116/p2e/js/script.jsでjavascriptを調べて、関数を確認することもできますcallTabContent

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

関数の内容を調べると、関連するパラメーターをフォームに投稿してからWebページを更新していることがわかります。

于 2013-03-12T08:58:37.480 に答える
-1

私はあなたの問題のすべての詳細を理解したかどうかわかりません。しかし、私が確かに知っているのは、casperJSがjavascriptで生成されたコンテンツに最適であるということです。

あなたはここでそれを見ることができます:http://casperjs.org/

これはJavascriptで書かれており、私が提供したリンクに非常によく文書化された便利な機能がたくさんあります。

私は最近それを個人的なプロジェクトに使用しており、数行のコードで簡単にセットアップできます。

試してごらん!願っています、それは助けになります。

于 2013-03-11T19:48:07.950 に答える