個人博客:無奈何楊(wnhyang)
個人語雀:wnhyang
共享語雀:在線知識共享
Github:wnhyang - Overview
起因
突然接收到XX
給的任務,要將一批IP
數據處理一下,將IP
對應的省市區解析出來,很急!
已知我這邊有一個IP
解析接口,提供了IP
解析到國家省市區ISP
等的能力,而且支持批量查詢,但問題是僅僅有接口的形式,沒有管理應用將接口利用起來,要使用的恐怕也只能是發接口,而且XX
提供的數據有極大可能是Excel
格式。另外XX
沒有說明解析后的數據怎么給出來,如果是Excel
最好就是將數據放在一行標記為省市區就好。這么看來只能是臨時開發來完成了,經過分析此時已經有了大致的思路了。
果然!拿到的數據是xls
格式,大致如下。共有幾百條。
a | b | c | ip | |
---|---|---|---|---|
123 | 234 | 345 | 127.0.0.1 |
那就動手開發吧!從接受到任務到結束大概用了40
分鐘,這不是炫耀什么,畢竟使用AI可能會更快更好,但這畢竟是臨時做的,完成的也還可以,我還挺欣慰的。
思路
任何臨時緊急的任務,第一目標都應該在時間要求內是完成它,所以總體思路就是先完成后優化。
其實做起來也很簡單
1、整理原始數據,也可以叫做數據清理。
2、讀IP數據
3、整合請求,發接口進行IP解析
4、解析數據補充在原數據上
5、輸出
這里提供了示例數據,IP數據來源于在線ip地址隨機生成器 - JSON中文網,其他數據都是隨機生成,一共270條。
📎示例IP.xlsx
關于接口,這里只能用一些開放的IP解析接口了,這里用的是https://api.vvhan.com/api/ipInfo?ip=58.154.0.0。
使用如上圖所示。
開始
原數據處理
本身數據很完整,所以這個步驟就沒有什么參考意義了。
關于文件格式,不管是xls
還是xlsx
都屬于微軟Ecxel
標準的電子表格格式,或擴展。都已經進行Office
文件處理的范疇了,相比于簡單的文本處理還是麻煩了點,這里為了方便將其另存為csv
文件,進行文本處理。
工具上使用CSV文件處理工具-CsvUtil。
這里需要注意了,使用csv
工具處理的文本,需要有行頭,所以在第一行加入了id,ip
,用于讀取。
一些實體類
讀取csv
的JavaBean
如下。
@Data
public class IpItem {private String id;private String ip;@Alias("國家")private String country;@Alias("省份")private String prov;@Alias("城市")private String city;
}
以上已將說明了要使用https://api.vvhan.com/api/ipInfo?ip=58.154.0.0作本次示例,響應報文如下。
{"success": true,"ip": "58.154.0.0","info": {"country": "中國","prov": "遼寧省","city": "沈陽市","isp": "教育網"}
}
這里可以使用JSON
轉JavaBean
的工具,不管是GsonFormatPlus
插件還是其他在線工具都可以。
GsonFormatPlus - IntelliJ IDEs Plugin | Marketplace
JSON轉JAVA實體|在線JSON轉JavaBean工具 - JSON中文網
由此得到IpRespDTO
、IpInfo
。
@Data
public class IpRespDTO {private Boolean success;private String ip;private IpInfo info;
}
@Data
public class IpInfo {private String country;private String prov;private String city;private String isp;
}
因為此接口請求比較簡單,所以就沒有額外的請求類了。
請求接口方式
關于方式,之前我有兩篇文章可以參考,這里使用OpenFeign
。
Spring6.1新特性,四種方式調用REST接口(RestClient、WebClient、RestTemplate、HTTP Interface)
Spring6|Spring Boot3有哪些HTTP客戶端可以選擇
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@FeignClient(name = "ipAnalysisFeignService", url = "https://api.vvhan.com/api")
public interface IpAnalysisFeignService {@GetMapping("/ipInfo")IpRespDTO getIpInfo(@RequestParam("ip") String ip);
}
數據處理與輸出
@Slf4j
@SpringBootTest
public class IpAnalysisFeignServiceTest {@Resourceprivate IpAnalysisFeignService ipAnalysisFeignService;@Testvoid getIpInfo() {List<IpItem> ipItemList = CsvUtil.getReader().read(ResourceUtil.getUtf8Reader("示例IP.csv"), IpItem.class);ipItemList.forEach(ipItem -> {IpRespDTO ipRespDTO = ipAnalysisFeignService.getIpInfo(ipItem.getIp());log.info("ip:{},info:{}", ipItem.getIp(), ipRespDTO);if (ipRespDTO.getSuccess()) {IpInfo info = ipRespDTO.getInfo();ipItem.setCountry(info.getCountry()).setProv(info.getProv()).setCity(info.getCity());}});CsvWriter writer = CsvUtil.getWriter("/Users/wnhyang/Downloads/testWrite.csv", CharsetUtil.CHARSET_UTF_8);writer.writeBeans(ipItemList);}
}
日志如下,共花費了43
秒,沒辦法這是開放的接口,性能確實差了點,而且是270
次請求。
輸出文件如下,好吧,一些ip
可能解析不到,但也是完成了任務。
結束
當時一共用了40
分鐘左右,你可能講了,用Java
進行數據處理?咋不用Python
?能合并請求嗎?能不能再優化一下?
確實有優化的地方,但是開頭我也講了,臨時緊急任務第一目標是在時間要求內完成,在完成后可以再思考優化。
而且,順帶提一點,平常可以做一些積累,在面對復雜的緊急任務時就會很從容了。https://github.com/wnhyang)
寫在最后
拙作艱辛,字句心血,望諸君垂青,多予支持,不勝感激。
個人博客:無奈何楊(wnhyang)
個人語雀:wnhyang
共享語雀:在線知識共享
Github:wnhyang - Overview