ybf

ybf


1.12中国招商网站汇率抓取代码参考

<p>/**</p> <ul> <li>中国招商(<a href="http://fx.cmbchina.com/Hq/)银行汇率爬取">http://fx.cmbchina.com/Hq/)银行汇率爬取</a></li> <li> </li> <li>@author</li> <li> <p>@date 2021-12-15 */ @Slf4j @Component public class MerchantsBankExchangePrice{</p> <p>private static final String BASE_URL=&quot;<a href="http://fx.cmbchina.com/Hq/">http://fx.cmbchina.com/Hq/</a>&quot;;</p> <p>final static Integer BUY_DIRECTION = TradeDirectionEnum.BUY_FROM_USER.getCode();</p> <p>final static Integer SELL_DIRECTION = TradeDirectionEnum.SELL_TO_USER.getCode();</p> <p>@Value(&quot;${exchange.rate.discard.time:2000}&quot;) private long exchangeRateDiscardTime;</p> <p>@Autowired private Environment environment;</p> <p>public List<BaseExchangeRateHistoryDTO> fetchExchangeRate(){ StopWatch stopWatch=new StopWatch(); String rs =null; try { stopWatch.start(); //本段代码为测试汇率波动使用,生产不执行------BEGIN int testSleepTime = environment.getProperty(&quot;exchange.rate.test.sleep.time&quot;, Integer.class, 0); if (testSleepTime&gt;0) { try { TimeUnit.SECONDS.sleep(testSleepTime); } catch (InterruptedException e) { e.printStackTrace(); } log.info(&quot;延迟测试时间,{}&quot;,testSleepTime); } //本段代码为测试汇率波动使用,生产不执行------END rs = HttpClientUtils.get(BASE_URL); stopWatch.stop(); }catch(Exception e){ log.error(&quot;【招商银行】汇率抓取异常,{}&quot;,e.getMessage(),e); rs=e.getMessage(); } List<BaseExchangeRateHistoryDTO> list=new ArrayList<>(2); if(StringUtils.isNotBlank(rs)){ try { Optional&lt;Map&lt;Integer, BigDecimal&gt;&gt; optional = parseHtml(rs,stopWatch); if(optional.isPresent()){ optional.get().forEach((k,v)-&gt;{ list.add(newInstance(v,k+&quot;:&quot;+v,k, BUY_DIRECTION.equals(k)?ApiInfoEnum.CMBCHINA_CNY_USD_FIRST_BUY_PRICE:ApiInfoEnum.CMBCHINA_CNY_USD_FIRST_SELL_PRICE, stopWatch.getTotalTimeMillis())); }); } }catch (Exception e){ log.error(&quot;【招商银行】汇率抓取结果:{},结果解析异常:{}&quot;,rs,e.getMessage(),e); rs=e.getMessage(); } } if(list.isEmpty()){ list.add(newInstance(null,rs,BUY_DIRECTION, ApiInfoEnum.CMBCHINA_CNY_USD_FIRST_BUY_PRICE, exchangeRateDiscardTime+1)); list.add(newInstance(null,rs,SELL_DIRECTION,ApiInfoEnum.CMBCHINA_CNY_USD_FIRST_SELL_PRICE,exchangeRateDiscardTime+1)); } return list; }</p> <p>private static BaseExchangeRateHistoryDTO newInstance(BigDecimal price, String responseString, Integer tradeType, ApiInfoEnum apiInfo, Long delayTime ){ BaseExchangeRateHistoryDTO baseExchangeRateHistoryDTO = new BaseExchangeRateHistoryDTO(); baseExchangeRateHistoryDTO.setCoinType(AssetType.USDT); baseExchangeRateHistoryDTO.setPriceTrading(RateTradingEnum.CNY_USD); baseExchangeRateHistoryDTO.setPriceUnit(AssetType.CNY); baseExchangeRateHistoryDTO.setDuration(delayTime); baseExchangeRateHistoryDTO.setResponse(responseString); baseExchangeRateHistoryDTO.setPrice(price); baseExchangeRateHistoryDTO.setDirection(tradeType); baseExchangeRateHistoryDTO.setApiInfo(apiInfo); baseExchangeRateHistoryDTO.setApiSource(RateSourceEnum.CMBCHINA); log.info(&quot;cmbbank baseExchangeRateHistoryDTO: {}&quot;, JacksonUtils.toJson(baseExchangeRateHistoryDTO)); return baseExchangeRateHistoryDTO; }</p> <p>private static Optional&lt;Map&lt;Integer, BigDecimal&gt;&gt; parseHtml(String html,StopWatch stopWatch){ Document document = Jsoup.parse(html); Elements data = document.getElementsByClass(&quot;data&quot;); Elements select = data.select(&quot;tbody&gt;tr&quot;); Optional&lt;Map&lt;Integer, BigDecimal&gt;&gt; optional = select.stream().filter(e -&gt; &quot;美元&quot;.equals(e.child(0).text())).map(e -&gt; { log.info(&quot;【招商银行】汇率抓取,请求地址:{} \n爬取结果:{} \n耗时:{}ms&quot;,BASE_URL,e.html(),stopWatch.getTotalTimeSeconds()); BigDecimal baseNum=new BigDecimal(100); //卖价 BigDecimal buy=new BigDecimal(e.child(3).text()); //买价 BigDecimal sell=new BigDecimal(e.child(5).text()); Map&lt;Integer, BigDecimal&gt; map = new HashMap<>(2); map.put(SELL_DIRECTION, sell.divide(baseNum,6, RoundingMode.DOWN)); map.put(BUY_DIRECTION, buy.divide(baseNum,6,RoundingMode.DOWN)); return map; }).findFirst(); return optional; } }</p> </li> </ul>

页面列表

ITEM_HTML