用了國內(nèi)的幾個web service的天氣預報服務,打著中央氣象局的幌子,本來用的還好好地,過了幾天,發(fā)現(xiàn)不能調(diào)用了,原來是服務器超過請求次數(shù)了,F(xiàn)ree到這種程序,對國內(nèi)的Free服務深感失望,心想還是用一直信賴的Google吧,所以就有了以下利用Http請求爬取Google天氣預報的代碼,并將請求過的城市天氣預報按天緩存一下:
示例程序效果地址:http://weather.faqee.com/
所有代碼如下:
- public NodeList getWeatherDiv(String htmlUrl) {
- NodeList res = null;
- try{
- Parser parser = new Parser(htmlUrl);
- parser.setEncoding("GBK");
-
- NodeFilter divFilter = new NodeClassFilter(Div.class);
-
- OrFilter lastFilter = new OrFilter();
- lastFilter
- .setPredicates(new NodeFilter[] { divFilter });
-
- NodeList nodeList = parser.parse(lastFilter);
- Node[] nodes = nodeList.toNodeArray();
-
- for (int i = 0; i < nodes.length; i++) {
- Node anode = (Node) nodes[i];
- if(anode instanceof Div){
- Div mydiv = (Div)anode;
- String className = mydiv.getAttribute("class");
- if(className!=null && className.equals("e")){
- res = mydiv.getChildren();
- }
- }
- }
- } catch (ParserException e) {
- e.printStackTrace();
- }
- return res;
- }
-
- public static void cleanCache() {
- if(isStart) return;
- isStart = true;
- TimerTask task = new TimerTask() {
- public void run() {
- Iterator it = hmCache.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry entry = (Map.Entry) it.next();
- Object key = entry.getKey();
- String today = DateTimeUtil.format(new Date(),"yyyyMMdd");
- if(key.toString().indexOf(today)>=0){
- it.remove();
- hmCache.remove(key);
- }
- }
- }
- };
- Timer timer = new Timer();
- timer.schedule(task, Calendar.getInstance ().getTime(), 24*3600 * 1000);
-
- }
-
-
- private void addWeatherDay(JSONObject json,int flag,String htmlContent){
- String tt = (flag==0?"t":("t"+flag));
- try{
-
- Node anode = null;
- Parser parser = Parser.createParser(htmlContent, "GBK");
- NodeFilter textFilter = new NodeClassFilter(TextNode.class);
- NodeFilter imgFilter = new NodeClassFilter(ImageTag.class);
-
- OrFilter lastFilter = new OrFilter();
- lastFilter.setPredicates(new NodeFilter[] { textFilter,imgFilter });
-
- NodeList nodeList = parser.parse(lastFilter);
- Node[] nodes = nodeList.toNodeArray();
- for (int i = 0; i < nodes.length; i++) {
- anode = (Node) nodes[i];
- if(anode instanceof ImageTag){
- ImageTag img = (ImageTag)anode;
- if(img!=null){
- json.put(tt+"_res", img.getAttribute("title"));
- json.put(tt+"_result", img.getAttribute("title"));
- json.put(tt+"_tp", ("http://www.google.cn"+img.getImageURL()));
- }
- }else if(anode instanceof TextNode){
- TextNode text = (TextNode)anode;
- String t = text.getText();
- if(t.indexOf("°C")>0){
- json.put(tt, t);
- }
- }
- }
-
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
-
- private void getDivText(JSONObject json, String htmlContent) {
- String line = "";
- Node anode = null;
- Div divnode = null;
- try {
- Parser parser = Parser.createParser(htmlContent, "GBK");
- NodeFilter divFilter = new NodeClassFilter(Div.class);
- OrFilter lastFilter = new OrFilter();
- lastFilter.setPredicates(new NodeFilter[] { divFilter });
-
- NodeList nodeList = parser.parse(lastFilter);
- int idx = 0;
- Node[] nodes = nodeList.toNodeArray();
- for (int i = 0; i < nodes.length; i++) {
- anode = (Node) nodes[i];
- line = "";
- if (anode instanceof Div) {
- divnode = (Div) anode;
- String className = StrCharUtil.formatNullStr(divnode.getAttribute("class"));
- String align = StrCharUtil.formatNullStr(divnode.getAttribute("align"));
- if(align.equals("")) continue;
- if(className.equals("") && align.equals("center")){
- line = divnode.getChildrenHTML();
- addWeatherDay(json,idx,line);
- idx ++;
- }
-
- }
- if (StrCharUtil.formatNullStr(line).equals(""))
- continue;
- }
- } catch (ParserException pe) {
- pe.printStackTrace();
- }
- }
-
- public JSONObject getWeather(String city){
- String today = DateTimeUtil.format(new Date(),"yyyyMMdd");
- if(hmCache.get(city+today)!=null){
- return hmCache.get(city+today);
- }
- JSONObject hm =new JSONObject();
- hm.put("zhishu","");
-
-
- try{
- city = getCityName(city);
- final String googleWeatherURL = "http://www.google.cn/search?hl=zh-CN&newwindow=1&q=tq+"+URLEncoder.encode(city,"UTF-8")+"&aq=f&oq=";
-
- NodeList nodeListDiv = getWeatherDiv(googleWeatherURL);
- int idx = 0;
- if(nodeListDiv!=null){
- getDivText(hm,nodeListDiv.toHtml());
- }
-
-
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
-
- hmCache.put(city+today, hm);
- return hm;
- }