我是网页抓取,get请求网站会返回如下字符串:
jQuery18305426675335038453_1429531451051({"d":[{"__metadata":"cool"}]})
整个代码在这里:
var baseUrl = "http://SOMEURL.COM?spatialFilter=nearby(52.47952651977539,-1.911009430885315,400)&$select=*&$top=200&$format=json&key=AjF8l9J6TH-WM5tkfFYdYE8NVUx9SFe4ya9aBaxKFFPBImvFWWHPOsRMSBesWblU&jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1";
var casper = require('casper').create({
verbose: false,
logLevel: 'debug',
pageSettings: {
loadImages: false,
loadPlugins: false
}
});
var fs = require('fs'),
shopInfo,
savePath,
date = new Date(),
secondsNow = date.getSeconds(),
day = date.getDate(),
minute = date.getMinutes();
month = date.getMonth() + 1,
fname = 'virginmedia-'+month+'-'+day+'-'+minute+'-'+secondsNow+'.txt';
function saveToFile(finalData) {
savePath = fs.pathJoin(fs.workingDirectory,
'output',fname);
fs.write(savePath, finalData, 'w');
}
casper.start(baseUrl, {
method: 'get',
headers: {
'Accept': 'application/json'
}});
casper.then(function getData(){
var rawData = this.getPageContent();
shopInfo = rawData;
shopInfo = shopInfo.replace("jQuery18305426675335038453_1429531451051(",'');
shopInfo = shopInfo.replace(/\)$/,'');
shopInfo = JSON.parse(shopInfo);
var resultPack = shopInfo.d.results;
var finalData = resultPack.map(function(val){
return [
val.Latitude,
val.Longitude,
val.EntityStoreName
];
});
saveToFile(JSON.stringify(finalData));
casper.echo("\n Hello! I just returned " + finalData.length
+ " shops");
});
casper.run();
换句话说,函数调用里面有效的json!但我需要JSON部分。
在浏览器中,我可以轻松地构建一个具有相同名称的函数,该函数返回自己的参数:
function jQuery18305426675335038453_1429531451051() {
return arguments[0];
}
但是在casperjs它只是不起作用。所以我的最后一个选择是使用正则表达式来获取JSON字符串:
shopInfo = shopInfo.replace("jQuery18305426675335038453_1429531451051(",'');
shopInfo = shopInfo.replace(/\)$/,'');
有没有更好的方法呢?
编辑1: 从评论我发现它实际上是JSONP,而不是JSON,生活变得轻松!我在搜索JSONP之后找到了here的答案。
编辑2: 在评论中找到的另一个解决方案:通过更改请求,网站自行返回正确的JSON!
答案 0 :(得分:1)
阅读完评论后,答案如下:
该格式称为JSONP,或带填充的JSON。它在here
实际上没有必要这样做,可以更改HTTP请求,以便返回真正的JSON数据。只需从请求中删除此部分:jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1