爬虫分析的问题,在线等大神。。
发布于 10 年前 作者 CarlosRen 7006 次浏览 最后一次编辑是 8 年前 来自 问答

工作原因,需要提供一个外汇汇率的实时接口,各位大神有好爬的网站可以推荐一发,没有的话可以看小弟找的这个 传送门在这里: 传送门-斯通纳德

这是小菜鸡写的代码:

var url = require('url');
var superagent = require('superagent');
var cheerio = require('cheerio');
var eventproxy = require('eventproxy');
var targetUrl = 'http://quote.fx168.com/showration/';
superagent.get(targetUrl).end(function(err,res){
	console.log(res.text);
	var $ = cheerio.load(res.text);
	$('.unnamed1').each(function (idx, element) {
	    console.log(element);
	});
});

首先说下我的思路,哪不对各位大神指教一下哈 1 把目标网页源码爬下来 2 用cheerio解析 3 把上面两步做成接口,传送json数据

然后写cheerio的时候我整个人都斯巴达了

12 回复

明显异步加载的,给你找到了,直接是类似jsonp的格式,爽YY了。
http://service.fx168.com/IDataPlatform/Quote/IQuoteConversionList.ashx?user=fx168&succ_callback=GetHbdhlSuccess

它这不是提供了jsonp接口了么, 在浏览器里面直接用就是了,为啥还要开服务端扒站? http://service.fx168.com/IDataPlatform/Quote/IQuoteConversionList.ashx?user=fx168&succ_callback=GetHbdhlSuccess

@cnwhy 哈!好巧呀, 刚发出去,发现你也发了。

@shy2850 这。。侧面突出了我菜狗的本质。。。咋找的

@cnwhy @shy2850 jsonp接口返回数据太大了,有没有参数指定汇率啊?比如我只关心usd/cny

@meekr 按你原本抓页面的方式抓这个接口 然后再过滤不就可以了么。自己包装一层接口。

@meekr @feliving nodejs不太会 java写的解析 可以后面直接插入自己的数据库

==========class GetJsonFromUrl=========== package web.json; import java.io.; import java.net.; public class GetJsonFromUrl { protected String getJsonString(String urlPath) throws Exception {
URL url = new URL(urlPath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream inputStream = connection.getInputStream();
//对应的字符编码转换
Reader reader = new InputStreamReader(inputStream, “UTF-8”);
BufferedReader bufferedReader = new BufferedReader(reader);
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
reader.close();
connection.disconnect();
return sb.toString();
}
}

=======class test ============ package web.json;

import net.sf.json.JSONArray; import net.sf.json.JSONObject;

public class Test {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	GetJsonFromUrl JsonBuilder = new GetJsonFromUrl();
	String urlpath = "http://service.fx168.com/IDataPlatform/Quote/IQuoteConversionList.ashx?user=fx168&succ_callback=GetHbdhlSuccess";
	String result = "";
	try {
		result = JsonBuilder.getJsonString(urlpath);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	//String resulttojson = result.substring(16,result.length()-1) ;
	//System.out.println("result is " + result);
	String resulttojson = result.substring(16,result.length()-1) ;
	//System.out.println(resulttojson.length());
	//System.out.println(result instanceof  String);
	JSONArray array = JSONArray.fromObject(resulttojson);
	System.out.println(array.size());
	
	for (int i = 0; i < array.size(); i++) {
		JSONObject jsonObj = array.getJSONObject(i);
		//System.out.println(jsonObj.get("CurrencyName"));
		System.out.println(jsonObj.getJSONArray("Currency").get(0));
		//System.out.println(jsonObj);
	}
	
}

}

BTW:nodejs应该更简单思路就是 收到请求,去掉包装,然后字符串转json或者直接操作字符串,拆他的结构

@CarlosRen 那明显js的代码要简单的多。 一般jsonp去掉callback参数返回的就是json格式数据.

过滤美元对人民币

var superagent = require('superagent');

var targetUrl = 'http://service.fx168.com/IDataPlatform/Quote/IQuoteConversionList.ashx?user=fx168';

superagent
	.get(targetUrl)
	.end(function(err,res){
		var data = JSON.parse(res.text);

		var dollar = data[0];
		dollar.Currency.forEach(function(item, index){
			if(item.CurrencyConversionName =='人民币'){
				console.log(dollar.CurrencyName + '==>' + item.CurrencyConversionName + ':' +item.CurrencyValue);
			}
		})
	});

cheerio慢一点,可以选择自己正则

node.js 没有直接解析 jsonp格式的中间件吗? npm 上面的一个superAgent-jsonp,可以试试。

回到顶部