解析知乎热榜
背景
实现一个简单的需求,解析知乎热榜,主要涉及找到热榜接口、json解析、返回值中文乱码处理(Unicode编码)、RestTemplate配置等等。
这只是简单的实现了功能,如果需要实际使用还有很多问题没有解决,比如自动获取的频率应该设置为多少,太频繁了可能导致被别人封禁,频率太低又没有时效性;
如果要应对并发访问,可以将获取来了的数据存到自己的缓存系统中去,比如redis中,自己系统访问的时候优先访问本地缓存,缓存的过期时间就参照上面的分析来设置。
以下是简单实现的步骤:
通过某种方式拿到关键接口
https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50
核心逻辑代码
package com.fast.alibaba.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 解析知乎热榜
*/
@Service
public class ZhiHuHotListService {
private final static String ZHI_HU_HOT_LIST_URL = "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50";
@Resource
RestTemplate restTemplate;
public String getZhiHuHot(){
List<String> list = new ArrayList<>();
String str = restTemplate.getForObject(ZHI_HU_HOT_LIST_URL,String.class);
JSONObject parse = (JSONObject)JSON.parse(str);
JSONArray array = (JSONArray)parse.get("data");
for (Object o : array.stream().toArray()) {
JSONObject jso = (JSONObject)o;
String detail_text = (String)jso.get("detail_text");
detail_text = detail_text.trim().replace("万热度","");// 热度,单位万
JSONObject target = (JSONObject)jso.get("target");
String title = (String)target.get("title");// 标题
String url = (String)target.get("url");// 问题链接
url = url.replace("api","www").replace("questions","question");
list.add(title);
System.out.println(title+"\t"+url+"\t"+detail_text);
}
return new Gson().toJson(list);
}
}
RestTemplate处理一下Unicode编码问题
package com.fast.alibaba.config;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().clear();
restTemplate.getMessageConverters().add(new FastJsonHttpMessageConverter());//Unicode编码处理
return restTemplate;
}
}
还没有评论,来说两句吧...