sidewalkcafe blog

日々是好日

jquery.xdomainajax.jsが動かなくなった

jsでクロスドメインのHTMLスクレイピングが使えるようになるjquery.xdomainajax.jsだけど、
しばらく前から使えないようになった。

結論

jquery.xdomainajax.jsの中身を以下のように変える

//古いデータ 18行目くらい
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',
query = 'select * from html where url="{URL}" and xpath="*"';
//新しいデータ 18行目くらい
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
query = 'select * from htmlstring where url="{URL}" and xpath="*"';

解説

jquery.xdomainajax.jsがクロスドメインの壁を超えるために、Yahoo!YQL というサービスを使ってたのだけど、それが使えなくなったのでURLを書き換えることで使えるようになったみたい。
ただ、返ってくるデータが生テキストからタグエスケープ済みのテキストデータになってるので、このままではセレクタの呼び出しや検索ができない。なので読み出し側も修正が必要。

呼び出し側の修正

//古いデータ resspnseTextをそのままjQueryオブジェクトに変換すればHTMLタグ化できた
$.ajax({  
    url: 'http://yahoo.co.jp/',
    type: 'GET',  
    success: function(data) {  
        content = $(data.responseText);
        $('body').append(content);
    }      
});  
//新しいデータ resspnseTextの中に<result>があり、その中にエスケープされたテキストが入ってるので
//オブジェクト化→アンエスケープ→オブジェクト化という手順を踏んでみた
$.ajax({  
    url: 'http://yahoo.co.jp/',
    type: 'GET',  
    success: function(data) {  
        content = $($(data.responseText).text());
        $('body').append(content);
    }      
});  

もっと良い方法があったら教えて下さい。