package com.yami.trading.huobi.task.summary; import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson.JSONObject; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.bean.item.domain.ItemSummary; import com.yami.trading.common.http.HttpHelper; import com.yami.trading.common.util.StringUtils; import com.yami.trading.service.item.ItemService; import com.yami.trading.service.item.ItemSummaryService; import lombok.extern.slf4j.Slf4j; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Component @Slf4j public class SummaryCrawl { @Autowired private ItemService itemService; @Autowired private ItemSummaryService itemSummaryService; public final static String A_stock_url_latest = "https://emweb.securities.eastmoney.com/PC_HSF10/OperationsRequired/PageAjax?code="; public final static String A_stock_url_company = "https://emweb.securities.eastmoney.com/PC_HSF10/CompanySurvey/PageAjax?code="; public final static String hk_stock_url_latest = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_HKF10_FN_MAININDICATOR&columns=HKF10_FN_MAININDICATOR_NEW"eColumns=&filter=(SECUCODE%3D%22{}.HK%22)&pageNumber=1&pageSize=1&sortTypes=-1&sortColumns=STD_REPORT_DATE&source=F10"; public final static String getHk_stock_url_company = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_HKF10_INFO_ORGPROFILE&columns=SECUCODE%2CSECURITY_CODE%2CORG_NAME%2CORG_EN_ABBR%2CBELONG_INDUSTRY%2CFOUND_DATE%2CCHAIRMAN%2CSECRETARY%2CACCOUNT_FIRM%2CREG_ADDRESS%2CADDRESS%2CYEAR_SETTLE_DAY%2CEMP_NUM%2CORG_TEL%2CORG_FAX%2CORG_EMAIL%2CORG_WEB%2CORG_PROFILE%2CREG_PLACE"eColumns=&filter=(SECUCODE%3D%22{}.HK%22)&pageNumber=1&pageSize=200&sortTypes=&sortColumns=&source=F10"; public final static String getHk_stock_url_se = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_HKF10_INFO_SECURITYINFO&columns=SECUCODE%2CSECURITY_CODE%2CSECURITY_NAME_ABBR%2CSECURITY_TYPE%2CLISTING_DATE%2CISIN_CODE%2CBOARD%2CTRADE_UNIT%2CTRADE_MARKET%2CGANGGUTONGBIAODISHEN%2CGANGGUTONGBIAODIHU"eColumns=&filter=(SECUCODE%3D%22{}.HK%22)&pageNumber=1&pageSize=200&sortTypes=&sortColumns=&source=F10"; public static final String uk_stock_url_latest = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_USF10_DATA_MAININDICATOR&columns=SECUCODE%2CSECURITY_CODE%2CSECURITY_NAME_ABBR%2CREPORT_DATE%2CCURRENCY%2CPE_TTM%2CRATIO_EPS_TTM%2CDPS_USD%2CSALE_GPR%2CTURNOVER%2CHOLDER_PROFIT%2CISSUED_COMMON_SHARES%2CPB%2CBVPS%2CDIVIDEND_RATE%2CSALE_NPR%2CTURNOVER_YOY%2CHOLDER_PROFIT_YOY%2CTOTAL_MARKET_CAP%2CORG_TYPE%2CSECURITY_TYPE"eColumns=&filter=(SECUCODE%3D%22{}.O%22)&pageNumber=1&page"; public static final String uk_stock_url_latest1 = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_USF10_DATA_MAININDICATOR&columns=ALL"eColumns=&filter=(SECUCODE%3D%22{}.N%22)&pageNumber=1&pageSize=200&sortTypes=-1&sortColumns=REPORT_DATE&source=INTLSECURITIE"; public final static String uk_stock_url_company = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_USF10_INFO_ORGPROFILE&columns=SECUCODE%2CSECURITY_CODE%2CORG_CODE%2CSECURITY_INNER_CODE%2CORG_NAME%2CORG_EN_ABBR%2CBELONG_INDUSTRY%2CFOUND_DATE%2CCHAIRMAN%2CREG_PLACE%2CADDRESS%2CEMP_NUM%2CORG_TEL%2CORG_FAX%2CORG_EMAIL%2CORG_WEB%2CORG_PROFILE"eColumns=&filter=(SECURITY_CODE%3D%22{}%22)&pageNumber=1&pageSize=200&sortTypes=&sortColumns=&source=SECURITIES"; public static final String uk_stock_url_se = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_USF10_INFO_SECURITYINFO&columns=SECUCODE%2CSECURITY_CODE%2CORG_CODE%2CSECURITY_INNER_CODE%2CSECURITY_TYPE%2CLISTING_DATE%2CISIN_CODE%2CTRADE_MARKET%2CYEAR_SETTLE_DAY%2CPAR_VALUE%2CCONVERT_RATIO%2CISSUE_PRICE%2CISSUE_NUM"eColumns=&filter=(SECUCODE%3D%22{}.O%22)&pageNumber=1&pageSize=200&sortTypes=&sortColumns=&source=SECURITIES&client=PC&v=0780594019016134"; public static final String uk_stock_url_se1 = "https://datacenter.eastmoney.com/securities/api/data/v1/get?reportName=RPT_USF10_INFO_SECURITYINFO%3BRPT_USF10_INFO_ORGPROFILE&columns=SECUCODE%2CSECURITY_CODE%2CSECURITY_TYPE%2CLISTING_DATE%2CTRADE_MARKET%2CISSUE_PRICE%2CISSUE_NUM%2C%40SECUCODE%3B%40SECUCODE%2CORG_NAME%2CORG_EN_ABBR%2CBELONG_INDUSTRY%2CFOUND_DATE%2CCHAIRMAN%2CADDRESS%2CORG_WEB"eColumns=&filter=(SECUCODE%3D%22{}.N%22)&pageNumber=1&pageSize=200&sortTypes=&sortColumns=&source=SECURITIES"; public static final String tw_stock_url = "https://www.cnyes.com/twstock/{}/company/profile"; public static final String etf_url = "http://stock.finance.sina.com.cn/fundInfo/view/FundInfo_JJGK.php?symbol=%s"; public static final String jp_url = "https://www.moomoo.com/hans/stock/{}-JP/company?global_content=%7B%22promote_id%22%3A13643,%22sub_promote_id%22%3A6%7D"; @Scheduled(cron = "0 30 2 * * 1") public void crawl() { log.info("开始初始化股票简况数据"); List list = new ArrayList<>(itemService.list()); for (Item item1 : list) { if (item1.getType().equalsIgnoreCase(Item.A_STOCKS)) { String symbol = item1.getSymbol(); try { crawlAStock(symbol); } catch (Exception e) { log.error("采集 {} 简况异常", symbol, e); } } } for (Item item1 : list) { if (item1.getType().equalsIgnoreCase(Item.HK_STOCKS)) { String symbol = item1.getSymbol(); try { crawlHkStock(symbol); } catch (Exception e) { log.error("采集 {} 简况异常", symbol, e); } } } for (Item item : list) { if (item.getType().equalsIgnoreCase(Item.US_STOCKS)) { String symbol = item.getSymbol(); try { crawlUsStock(symbol); } catch (Exception e) { log.error("采集 {} 简况异常", symbol, e); } } } for (Item item : list) { if (item.getType().equalsIgnoreCase(Item.TW_STOCKS)) { String symbol = item.getSymbol(); if (!NumberUtil.isNumber(symbol)) { continue; } try { crawlTWStock(symbol); } catch (Exception e) { log.error("采集 {} 简况异常", symbol, e); } } } for (Item item : list) { if (item.getType().equalsIgnoreCase(Item.indices)) { String symbol = item.getSymbol(); if (symbol.contains("SH") || symbol.contains("SZ")) { try { crawlETF(symbol); } catch (Exception e) { log.error("采集 {} 简况异常", symbol, e); } } } } for (Item item : list) { if (item.getType().equalsIgnoreCase(Item.JP_STOCKS)) { String symbol = item.getSymbol(); try { crawlJP(symbol); } catch (Exception e) { log.error("采集 {} 简况异常", symbol, e); } } } } public void crawlAStock(String symbol) { String content = HttpHelper.sendGetHttp(A_stock_url_latest + symbol, ""); JSONObject data = JSONObject.parseObject(content); ItemSummary itemSummary = itemSummaryService.getOrNewOne(symbol); itemSummary.setSymbol(symbol); // 基本每股收益 String EPSJB = data.getJSONArray("zxzb").getJSONObject(0).getString("EPSJB"); itemSummary.setEps(toFixed(EPSJB, 4)); log.info("基本每股收益-- " + EPSJB); // 每股净资产 String BPS = data.getJSONArray("zxzb").getJSONObject(0).getString("BPS"); itemSummary.setBps(toFixed(BPS, 4)); log.info("每股净资产-- " + BPS); // 市净率 String PB_NEW_NOTICE = data.getJSONArray("zxzbOther").getJSONObject(0).getString("PB_NEW_NOTICE"); itemSummary.setPbTtm(PB_NEW_NOTICE); log.info("市净率-- " + PB_NEW_NOTICE); // 总营同比 String TOTALOPERATEREVETZ = data.getJSONArray("zyzb").getJSONObject(0).getString("TOTALOPERATEREVETZ"); itemSummary.setYoyTotalOperatingRevenue(toFixed(TOTALOPERATEREVETZ, 2) + "%"); log.info("总营同比-- " + TOTALOPERATEREVETZ); // 营业总收入 String TOTAL_OPERATEINCOME = data.getJSONArray("zxzb").getJSONObject(0).getString("TOTAL_OPERATEINCOME"); itemSummary.setYoyTotalOperatingRevenue(formatMoney(TOTAL_OPERATEINCOME)); log.info("营业总收入-- " + TOTAL_OPERATEINCOME); //净利润同比 String PARENTNETPROFITTZ = data.getJSONArray("zxzb").getJSONObject(0).getString("PARENTNETPROFITTZ"); itemSummary.setYoyNetProfit(toFixed(PARENTNETPROFITTZ, 2) + "%"); log.info("净利润同比-- " + PARENTNETPROFITTZ); // 净利率 没有 // 资产负载率 String ZCFZL = data.getJSONArray("zxzb").getJSONObject(0).getString("ZCFZL"); itemSummary.setDebtRatio(toFixed(ZCFZL, 2) + "%"); log.info("资产负载率-- " + ZCFZL); //总市值 String TOTAL_MARKET_CAP = data.getJSONObject("zxzbhq").getString("f116"); itemSummary.setSkMarketCap(formatMoney(TOTAL_MARKET_CAP)); log.info("总市值-- " + TOTAL_MARKET_CAP); // 流通股本 String FREE_SHARE = data.getJSONArray("zxzb").getJSONObject(0).getString("FREE_SHARE"); itemSummary.setCirculatingAShares(FREE_SHARE); log.info("流通A市值-- " + FREE_SHARE); // 毛利率 String XSMLL = data.getJSONArray("zxzb").getJSONObject(0).getString("XSMLL"); itemSummary.setGrossProfitMargin(toFixed(XSMLL, 2) + "%"); log.info("毛利率-- " + XSMLL); // 流通股本 String TOTAL_SHARE = data.getJSONArray("zxzb").getJSONObject(0).getString("TOTAL_SHARE"); itemSummary.setCommonAcs(TOTAL_SHARE); log.info("流通股本-- " + TOTAL_SHARE); //净资产收益率 String ROEJQ = data.getJSONArray("zxzb").getJSONObject(0).getString("ROEJQ"); itemSummary.setGrossProfitMargin(toFixed(ROEJQ, 2) + "%"); log.info("净资产收益率-- " + ROEJQ); // 净利润 String PARENTNETPROFIT = data.getJSONArray("zyzb").getJSONObject(0).getString("PARENTNETPROFIT"); itemSummary.setNetProfit(formatMoney(PARENTNETPROFIT)); log.info("净利润-- " + PARENTNETPROFIT); // 市盈率 String peTtm = data.getJSONArray("zxzbOther").getJSONObject(0).getString("PE_STATIC"); itemSummary.setPeTtm(toFixed(peTtm, 2)); log.info("市盈率-- " + peTtm); String companyContent = HttpHelper.sendGetHttp(A_stock_url_company + symbol, ""); JSONObject companyContentData = JSONObject.parseObject(companyContent); // 公司名称 String orgName = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ORG_NAME"); itemSummary.setOrgName(orgName); log.info("公司名称-- " + orgName); // 英文名称 String ORG_NAME_EN = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ORG_NAME_EN"); itemSummary.setEnName(ORG_NAME_EN); log.info("英文名称-- " + ORG_NAME_EN); // A股代码 String STR_CODEA = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("STR_CODEA"); itemSummary.setStrCodeA(STR_CODEA); log.info("A股代码-- " + STR_CODEA); // A股简称 String STR_NAMEA = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("STR_NAMEA"); itemSummary.setStrNameA(STR_NAMEA); log.info("A股简称-- " + STR_NAMEA); // 所属区域 String PROVINCE = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("PROVINCE"); itemSummary.setRegion(PROVINCE); log.info("所属区域-- " + PROVINCE); // 所属行业 String EM2016 = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("EM2016"); itemSummary.setBelongIndustry(EM2016); log.info("所属行业-- " + EM2016); // 所属概念 //董事长 String CHAIRMAN = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("CHAIRMAN"); itemSummary.setChairman(CHAIRMAN); log.info("董事长-- " + CHAIRMAN); //总经理 String PRESIDENT = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("PRESIDENT"); itemSummary.setManagingDirector(PRESIDENT); log.info("总经理-- " + PRESIDENT); //法人代表 String LEGAL_PERSON = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("LEGAL_PERSON"); itemSummary.setLegalRepresentative(LEGAL_PERSON); log.info("法人代表-- " + LEGAL_PERSON); //董秘 String SECRETARY = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("SECRETARY"); itemSummary.setLegalRepresentative(SECRETARY); log.info("董秘-- " + SECRETARY); //成立日期 String FOUND_DATE = companyContentData.getJSONArray("fxxg").getJSONObject(0).getString("FOUND_DATE"); itemSummary.setFoundDate(FOUND_DATE); log.info("成立日期-- " + FOUND_DATE); //注册资本 String REG_CAPITAL = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("REG_CAPITAL"); itemSummary.setRegisteredCapital(formatMoney(REG_CAPITAL)); log.info("注册资本-- " + REG_CAPITAL); //员工人数 String EMP_NUM = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("EMP_NUM"); itemSummary.setEmpNum((EMP_NUM)); log.info("员工人数-- " + EMP_NUM); //管理层人数 String TATOLNUMBER = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("TATOLNUMBER"); itemSummary.setManagementTeamSize((TATOLNUMBER)); log.info("管理层人数-- " + TATOLNUMBER); //审计机构 String ACCOUNTFIRM_NAME = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ACCOUNTFIRM_NAME"); itemSummary.setAuditOrganization((ACCOUNTFIRM_NAME)); log.info("审计机构-- " + ACCOUNTFIRM_NAME); //法律顾问 String LAW_FIRM = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("LAW_FIRM"); itemSummary.setLegalAdvisor((LAW_FIRM)); log.info("法律顾问-- " + LAW_FIRM); //联系电话 String ORG_TEL = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ORG_TEL"); itemSummary.setOrgTel((ORG_TEL)); log.info("联系电话-- " + ORG_TEL); //公司邮箱 String ORG_EMAIL = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ORG_EMAIL"); itemSummary.setOrgEmail(ORG_EMAIL); log.info("公司邮箱-- " + ORG_EMAIL); //公司网址 String ORG_WEB = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ORG_WEB"); itemSummary.setOrgWeb((ORG_WEB)); log.info("公司网址-- " + ORG_WEB); //办公地址 String ADDRESS = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ADDRESS"); itemSummary.setAddress((ADDRESS)); log.info("办公地址-- " + ADDRESS); //注册地址 String REG_ADDRESS = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("REG_ADDRESS"); itemSummary.setRegAddress(REG_ADDRESS); log.info("注册地址-- " + REG_ADDRESS); //公司简介 String ORG_PROFILE = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("ORG_PROFILE"); itemSummary.setOrgProfile(ORG_PROFILE); log.info("公司简介-- " + ORG_PROFILE); //BUSINESS_SCOPE //公司简介 String BUSINESS_SCOPE = companyContentData.getJSONArray("jbzl").getJSONObject(0).getString("BUSINESS_SCOPE"); itemSummary.setBusinessScope(BUSINESS_SCOPE); log.info("主营业务-- " + BUSINESS_SCOPE); itemSummaryService.saveOrUpdate(itemSummary); } /** * @param symbol */ public void crawlHkStock(String symbol) { String content = HttpHelper.sendGetHttp(hk_stock_url_latest.replace("{}", symbol), ""); JSONObject data = JSONObject.parseObject(content); ItemSummary itemSummary = itemSummaryService.getOrNewOne(symbol); itemSummary.setSymbol(symbol); // 基本每股收益 JSONObject jsonObject = data.getJSONObject("result").getJSONArray("data").getJSONObject(0); String EPSJB = jsonObject.getString("BASIC_EPS"); itemSummary.setEps(toFixed(EPSJB, 4)); log.info("基本每股收益-- " + EPSJB); // 每股股息 String DPS_HKD = jsonObject.getString("DPS_HKD"); itemSummary.setDpsHkd(toFixed(DPS_HKD, 4)); log.info("每股股息-- " + DPS_HKD); //港股股本 String HK_COMMON_SHARES = jsonObject.getString("HK_COMMON_SHARES"); itemSummary.setHongKongStockCapital(toFixed(HK_COMMON_SHARES, 4)); log.info("港股股本-- " + HK_COMMON_SHARES); //总股本 String ISSUED_COMMON_SHARES = jsonObject.getString("ISSUED_COMMON_SHARES"); itemSummary.setCommonAcs(toFixed(ISSUED_COMMON_SHARES, 4)); log.info("港股股本-- " + ISSUED_COMMON_SHARES); // 每股净资产 String BPS = jsonObject.getString("BPS"); itemSummary.setBps(toFixed(BPS, 4)); log.info("每股净资产-- " + BPS); // 市净率 String PB_NEW_NOTICE = jsonObject.getString("PB_TTM"); itemSummary.setPbTtm(PB_NEW_NOTICE); log.info("市净率-- " + PB_NEW_NOTICE); // 总营同比 String TOTALOPERATEREVETZ = jsonObject.getString("OPERATE_INCOME_QOQ"); itemSummary.setYoyTotalOperatingRevenue(toFixed(TOTALOPERATEREVETZ, 2) + "%"); log.info("总营同比-- " + TOTALOPERATEREVETZ); // 营业总收入 String TOTAL_OPERATEINCOME = jsonObject.getString("OPERATE_INCOME"); itemSummary.setYoyTotalOperatingRevenue(formatMoney(TOTAL_OPERATEINCOME)); log.info("营业总收入-- " + TOTAL_OPERATEINCOME); //净利润同比 String PARENTNETPROFITTZ = jsonObject.getString("HOLDER_PROFIT_QOQ"); itemSummary.setYoyNetProfit(toFixed(PARENTNETPROFITTZ, 2) + "%"); log.info("净利润同比-- " + PARENTNETPROFITTZ); // 净利率 String NET_PROFIT_RATIO = jsonObject.getString("NET_PROFIT_RATIO"); itemSummary.setYoyNetProfit(toFixed(NET_PROFIT_RATIO, 2) + "%"); log.info("净利率-- " + NET_PROFIT_RATIO); // 股息率 String DIVIDEND_RATE = jsonObject.getString("DIVIDEND_RATE"); itemSummary.setDividendRate(toFixed(DIVIDEND_RATE, 2) + "%"); log.info("股息率-- " + DIVIDEND_RATE); // 资产负载率 // String ZCFZL = data.getJSONArray("zxzb").getJSONObject(0).getString("ZCFZL"); // itemSummary.setDebtRatio(toFixed(ZCFZL, 2)+"%"); // log.info("资产负载率-- " + ZCFZL); //总市值 String TOTAL_MARKET_CAP = jsonObject.getString("TOTAL_MARKET_CAP"); itemSummary.setSkMarketCap(formatMoney(TOTAL_MARKET_CAP)); log.info("总市值-- " + TOTAL_MARKET_CAP); //港股市值 String HKSK_MARKET_CAP = jsonObject.getString("HKSK_MARKET_CAP"); itemSummary.setHkskMarketCap(formatMoney(HKSK_MARKET_CAP)); log.info("总市值-- " + HKSK_MARKET_CAP); // 净利润 String PARENTNETPROFIT = jsonObject.getString("HOLDER_PROFIT"); itemSummary.setNetProfit(formatMoney(PARENTNETPROFIT)); log.info("净利润-- " + PARENTNETPROFIT); // 市盈率 String peTtm = jsonObject.getString("PE_TTM"); itemSummary.setPeTtm(toFixed(peTtm, 2)); log.info("市盈率-- " + peTtm); String companyContent = HttpHelper.sendGetHttp(getHk_stock_url_company.replace("{}", symbol), ""); // 公司名称 JSONObject companyData = JSONObject.parseObject(companyContent).getJSONObject("result").getJSONArray("data").getJSONObject(0); String orgName = companyData.getString("ORG_NAME"); itemSummary.setOrgName(orgName); log.info("公司名称-- " + orgName); // 所属行业 String EM2016 = companyData.getString("BELONG_INDUSTRY"); itemSummary.setBelongIndustry(EM2016); log.info("所属行业-- " + EM2016); // 英文名称 String ORG_NAME_EN = companyData.getString("ORG_EN_ABBR"); itemSummary.setEnName(ORG_NAME_EN); log.info("英文名称-- " + ORG_NAME_EN); //董事长 String CHAIRMAN = companyData.getString("CHAIRMAN"); itemSummary.setChairman(CHAIRMAN); log.info("董事长-- " + CHAIRMAN); //董秘 String SECRETARY = companyData.getString("SECRETARY"); itemSummary.setLegalRepresentative(SECRETARY); log.info("董秘-- " + SECRETARY); //成立日期 String FOUND_DATE = companyData.getString("FOUND_DATE"); itemSummary.setFoundDate(FOUND_DATE); log.info("成立日期-- " + FOUND_DATE); //员工人数 String EMP_NUM = companyData.getString("EMP_NUM"); itemSummary.setEmpNum((EMP_NUM)); log.info("员工人数-- " + EMP_NUM); //联系电话 String ORG_TEL = companyData.getString("ORG_TEL"); itemSummary.setOrgTel((ORG_TEL)); log.info("联系电话-- " + ORG_TEL); //公司邮箱 String ORG_EMAIL = companyData.getString("ORG_EMAIL"); itemSummary.setOrgEmail(ORG_EMAIL); log.info("公司邮箱-- " + ORG_EMAIL); //公司网址 String ORG_WEB = companyData.getString("ORG_WEB"); itemSummary.setOrgWeb((ORG_WEB)); log.info("公司网址-- " + ORG_WEB); //办公地址 String ADDRESS = companyData.getString("ADDRESS"); itemSummary.setAddress((ADDRESS)); log.info("办公地址-- " + ADDRESS); // 传真 String ORG_FAX = companyData.getString("ORG_FAX"); itemSummary.setOrgFax((ORG_FAX)); log.info("传真-- " + ORG_FAX); //注册地址 String REG_ADDRESS = companyData.getString("REG_ADDRESS"); itemSummary.setRegAddress(REG_ADDRESS); log.info("注册地址-- " + REG_ADDRESS); //公司简介 String ORG_PROFILE = companyData.getString("ORG_PROFILE"); itemSummary.setOrgProfile(ORG_PROFILE); log.info("公司简介-- " + ORG_PROFILE); //核数师 String ACCOUNT_FIRM = companyData.getString("ACCOUNT_FIRM"); itemSummary.setAccountFirm(ACCOUNT_FIRM); log.info("核数师-- " + ACCOUNT_FIRM); // 证券资料部分 /** * * * * * * 每股面值 */ String seContent = HttpHelper.sendGetHttp(getHk_stock_url_se.replace("{}", symbol), ""); JSONObject seData = JSONObject.parseObject(seContent).getJSONObject("result").getJSONArray("data").getJSONObject(0); //证券代码 String SECUCODE = seData.getString("SECUCODE"); itemSummary.setSecucode(SECUCODE); log.info("证券代码-- " + SECUCODE); //证券类型 String SECURITY_TYPE = seData.getString("SECURITY_TYPE"); itemSummary.setSecurityType(SECURITY_TYPE); log.info("证券类型-- " + SECURITY_TYPE); //ISIN String ISIN = seData.getString("ISIN_CODE"); itemSummary.setIsinCode(ISIN); log.info("ISIN-- " + ISIN); //上市时间 String listingDate = seData.getString("LISTING_DATE"); itemSummary.setListingDate(listingDate); log.info("上市时间-- " + listingDate); //板块 String board = seData.getString("BOARD"); itemSummary.setBoard(board); log.info("板块-- " + board); //年结日 String yearSettleDay = companyData.getString("YEAR_SETTLE_DAY"); itemSummary.setYearSettleDay(yearSettleDay); log.info("板块-- " + yearSettleDay); //每手股数 String TRADE_UNIT = seData.getString("TRADE_UNIT"); itemSummary.setTradeUnit(TRADE_UNIT); log.info("每手股数-- " + TRADE_UNIT); itemSummaryService.saveOrUpdate(itemSummary); } /** * @param symbol */ public void crawlUsStock(String symbol) { /** * */ String content = HttpHelper.sendGetHttp(uk_stock_url_latest.replace("{}", symbol), ""); if (content.contains("返回数据为空")) { content = HttpHelper.sendGetHttp(uk_stock_url_latest1.replace("{}", symbol), ""); } if (content.contains("返回数据为空")) { log.error("{} 简况数据不存在", symbol); return; } JSONObject data = JSONObject.parseObject(content); ItemSummary itemSummary = itemSummaryService.getOrNewOne(symbol); itemSummary.setSymbol(symbol); JSONObject jsonObject = data.getJSONObject("result").getJSONArray("data").getJSONObject(0); // 市盈率 String peTtm = jsonObject.getString("PE_TTM"); itemSummary.setPeTtm(toFixed(peTtm, 2)); log.info("市盈率-- " + peTtm); // 基本每股收益 String EPSJB = jsonObject.getString("RATIO_EPS_TTM"); itemSummary.setEps(toFixed(EPSJB, 4)); log.info("基本每股收益-- " + EPSJB); // 每股股息 String DPS_HKD = jsonObject.getString("DPS_USD"); itemSummary.setDpsHkd(toFixed(DPS_HKD, 4)); log.info("每股股息-- " + DPS_HKD); //总股本 String ISSUED_COMMON_SHARES = jsonObject.getString("ISSUED_COMMON_SHARES"); itemSummary.setCommonAcs(toFixed(ISSUED_COMMON_SHARES, 4)); log.info("总股本-- " + ISSUED_COMMON_SHARES); // 每股净资产 String BPS = jsonObject.getString("BVPS"); itemSummary.setBps(toFixed(BPS, 4)); log.info("每股净资产-- " + BPS); // 市净率 String PB_NEW_NOTICE = jsonObject.getString("PB"); itemSummary.setPbTtm(PB_NEW_NOTICE); log.info("市净率-- " + PB_NEW_NOTICE); // 毛利率 String SALE_GPR = jsonObject.getString("SALE_GPR"); itemSummary.setGrossProfitMargin(toFixed(SALE_GPR, 2) + "%"); log.info("毛利率-- " + SALE_GPR); // 归母净利润 String HOLDER_PROFIT = jsonObject.getString("HOLDER_PROFIT"); itemSummary.setProfitParentCompany(formatMoney(HOLDER_PROFIT)); log.info("归母净利润-- " + HOLDER_PROFIT); // 归母净利润同比 String HOLDER_PROFIT_YOY = jsonObject.getString("HOLDER_PROFIT_YOY"); itemSummary.setYoyTotalOperatingRevenue(toFixed(HOLDER_PROFIT_YOY, 2) + "%"); log.info("归母净利润同比-- " + HOLDER_PROFIT_YOY); // 总营同比 String TOTALOPERATEREVETZ = jsonObject.getString("TURNOVER_YOY"); itemSummary.setYoyTotalOperatingRevenue(toFixed(TOTALOPERATEREVETZ, 2) + "%"); log.info("总营同比-- " + TOTALOPERATEREVETZ); // 营业总收入 String TOTAL_OPERATEINCOME = jsonObject.getString("TURNOVER"); itemSummary.setYoyTotalOperatingRevenue(formatMoney(TOTAL_OPERATEINCOME)); log.info("营业总收入-- " + TOTAL_OPERATEINCOME); //净利润同比 String PARENTNETPROFITTZ = jsonObject.getString("HOLDER_PROFIT_QOQ"); itemSummary.setYoyNetProfit(toFixed(PARENTNETPROFITTZ, 2) + "%"); log.info("净利润同比-- " + PARENTNETPROFITTZ); // 净利率 String NET_PROFIT_RATIO = jsonObject.getString("SALE_NPR"); itemSummary.setYoyNetProfit(toFixed(NET_PROFIT_RATIO, 2) + "%"); log.info("净利率-- " + NET_PROFIT_RATIO); // 股息率 String weeklyInterestRate = jsonObject.getString("DIVIDEND_RATE"); itemSummary.setDividendRate(toFixed(weeklyInterestRate, 2) + "%"); log.info("股息率-- " + weeklyInterestRate); //总市值 String TOTAL_MARKET_CAP = jsonObject.getString("TOTAL_MARKET_CAP"); itemSummary.setSkMarketCap(formatMoney(TOTAL_MARKET_CAP)); log.info("总市值-- " + TOTAL_MARKET_CAP); // 净利润 String PARENTNETPROFIT = jsonObject.getString("HOLDER_PROFIT"); itemSummary.setNetProfit(formatMoney(PARENTNETPROFIT)); log.info("净利润-- " + PARENTNETPROFIT); String companyContent = HttpHelper.sendGetHttp(uk_stock_url_company.replace("{}", symbol), ""); // 公司名称 JSONObject companyData = JSONObject.parseObject(companyContent).getJSONObject("result").getJSONArray("data").getJSONObject(0); String orgName = companyData.getString("ORG_NAME"); itemSummary.setOrgName(orgName); log.info("公司名称-- " + orgName); // 所属行业 String EM2016 = companyData.getString("BELONG_INDUSTRY"); itemSummary.setBelongIndustry(EM2016); log.info("所属行业-- " + EM2016); // 英文名称 String ORG_NAME_EN = companyData.getString("ORG_EN_ABBR"); itemSummary.setEnName(ORG_NAME_EN); log.info("英文名称-- " + ORG_NAME_EN); //董事长 String CHAIRMAN = companyData.getString("CHAIRMAN"); itemSummary.setChairman(CHAIRMAN); log.info("董事长-- " + CHAIRMAN); //董秘 String SECRETARY = companyData.getString("SECRETARY"); itemSummary.setLegalRepresentative(SECRETARY); log.info("董秘-- " + SECRETARY); //成立日期 String FOUND_DATE = companyData.getString("FOUND_DATE"); itemSummary.setFoundDate(FOUND_DATE); log.info("成立日期-- " + FOUND_DATE); //员工人数 String EMP_NUM = companyData.getString("EMP_NUM"); itemSummary.setEmpNum((EMP_NUM)); log.info("员工人数-- " + EMP_NUM); //联系电话 String ORG_TEL = companyData.getString("ORG_TEL"); itemSummary.setOrgTel((ORG_TEL)); log.info("联系电话-- " + ORG_TEL); //公司邮箱 String ORG_EMAIL = companyData.getString("ORG_EMAIL"); itemSummary.setOrgEmail(ORG_EMAIL); log.info("公司邮箱-- " + ORG_EMAIL); //公司网址 String ORG_WEB = companyData.getString("ORG_WEB"); itemSummary.setOrgWeb((ORG_WEB)); log.info("公司网址-- " + ORG_WEB); //办公地址 String ADDRESS = companyData.getString("ADDRESS"); itemSummary.setAddress((ADDRESS)); log.info("办公地址-- " + ADDRESS); // 传真 String ORG_FAX = companyData.getString("ORG_FAX"); itemSummary.setOrgFax((ORG_FAX)); log.info("传真-- " + ORG_FAX); //注册地址 String REG_ADDRESS = companyData.getString("REG_PLACE"); itemSummary.setRegAddress(REG_ADDRESS); log.info("注册地址-- " + REG_ADDRESS); //公司简介 String ORG_PROFILE = companyData.getString("ORG_PROFILE"); itemSummary.setOrgProfile(ORG_PROFILE); log.info("公司简介-- " + ORG_PROFILE); //核数师 String ACCOUNT_FIRM = companyData.getString("ACCOUNT_FIRM"); itemSummary.setAccountFirm(ACCOUNT_FIRM); log.info("核数师-- " + ACCOUNT_FIRM); // 证券资料部分 /** * 年结日 */ String seContent = HttpHelper.sendGetHttp(uk_stock_url_se.replace("{}", symbol), ""); if (seContent.contains("返回数据为空")) { seContent = HttpHelper.sendGetHttp(uk_stock_url_se1.replace("{}", symbol), ""); } JSONObject seData = JSONObject.parseObject(seContent).getJSONObject("result").getJSONArray("data").getJSONObject(0); //证券代码 String SECUCODE = seData.getString("SECUCODE"); itemSummary.setSecucode(SECUCODE); log.info("证券代码-- " + SECUCODE); //证券类型 String SECURITY_TYPE = seData.getString("SECURITY_TYPE"); itemSummary.setSecurityType(SECURITY_TYPE); log.info("证券类型-- " + SECURITY_TYPE); //ISIN String ISIN = seData.getString("ISIN_CODE"); itemSummary.setIsinCode(ISIN); log.info("ISIN-- " + ISIN); //上市时间 String listingDate = seData.getString("LISTING_DATE"); itemSummary.setListingDate(listingDate); log.info("上市时间-- " + listingDate); //上市场所 String TRADE_MARKET = seData.getString("TRADE_MARKET"); itemSummary.setStockExchange(TRADE_MARKET); log.info("上市场所-- " + TRADE_MARKET); //年结日 String yearSettleDay = companyData.getString("YEAR_SETTLE_DAY"); itemSummary.setYearSettleDay(yearSettleDay); log.info("年结日-- " + yearSettleDay); //每股面值 String TRADE_UNIT = seData.getString("PAR_VALUE"); itemSummary.setParValuePerShare(TRADE_UNIT); log.info("每股面值-- " + TRADE_UNIT); itemSummaryService.saveOrUpdate(itemSummary); } public static String toFixed(String content, int scale) { if (StringUtils.isEmptyString(content)) { return "-"; } if (content.contains("null")) { return "-"; } return new BigDecimal(content).setScale(scale, RoundingMode.HALF_UP).toPlainString(); } public static String formatMoney(String moneyStr) { if (StringUtils.isEmptyString(moneyStr)) { return "--"; } BigDecimal money = new BigDecimal(moneyStr); BigDecimal wan = new BigDecimal("10000"); BigDecimal yi = new BigDecimal("100000000"); BigDecimal wanYi = new BigDecimal("1000000000000"); String result = ""; if (money.compareTo(wanYi) >= 0) { BigDecimal value = money.divide(wanYi, 3, BigDecimal.ROUND_HALF_UP); result = value.toPlainString() + "万亿"; } else if (money.compareTo(yi) >= 0) { BigDecimal value = money.divide(yi, 3, BigDecimal.ROUND_HALF_UP); result = value.toPlainString() + "亿"; } else if (money.compareTo(wan) >= 0) { BigDecimal value = money.divide(wan, 3, BigDecimal.ROUND_HALF_UP); result = value.toPlainString() + "万"; } else { result = money.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString(); } return result; } /** * @param symbol */ public void crawlTWStock(String symbol) { /** * */ String content = HttpHelper.sendGetHttp(tw_stock_url.replace("{}", symbol), ""); if (content.contains("Internal Server Error.")) { log.error("{} 简况数据不存在", symbol); return; } ItemSummary itemSummary = itemSummaryService.getOrNewOne(symbol); // ItemSummary itemSummary = new ItemSummary(); itemSummary.setSymbol(symbol); // 公司名称 Document doc = Jsoup.parse(content); Elements orgNameEles = doc.select("div.jsx-63551769.title-container > h3"); String orgName = orgNameEles.get(0).text(); itemSummary.setOrgName(orgName); log.info("公司名称-- " + orgName); String strNameA = doc.select("div.jsx-2887475226.quote-header > div.jsx-162737614.container > h2").get(0).text(); itemSummary.setStrNameA(strNameA); log.info("公司简称-- " + orgName); // 所属地区 itemSummary.setRegion("台湾省"); Elements profilesEles = doc.select("div.jsx-63551769.detail-row-container").get(0).children(); //董事长 String CHAIRMAN = profilesEles.get(0).children().get(1).text(); itemSummary.setChairman(CHAIRMAN); log.info("董事长-- " + CHAIRMAN); //总经理 String PRESIDENT = profilesEles.get(1).children().get(1).text(); itemSummary.setManagingDirector(PRESIDENT); log.info("总经理-- " + PRESIDENT); //董秘,发言人 String SECRETARY = profilesEles.get(2).children().get(1).text(); itemSummary.setSecretary(SECRETARY); log.info("董秘-- " + SECRETARY); //成立日期 String FOUND_DATE = profilesEles.get(3).children().get(1).text(); itemSummary.setFoundDate(FOUND_DATE); log.info("成立日期-- " + FOUND_DATE); //上市时间 String listingDate = profilesEles.get(4).children().get(1).text(); itemSummary.setListingDate(listingDate); log.info("上市时间-- " + listingDate); //上櫃日期 String yearSettleDay = profilesEles.get(5).children().get(1).text(); itemSummary.setYearSettleDay(yearSettleDay); log.info("年结日-- " + yearSettleDay); Elements contentEles = doc.select("div.jsx-4082504959.content-container").get(0).children(); // 所属行业 String EM2016 = contentEles.get(0).children().get(1).text(); itemSummary.setBelongIndustry(EM2016); log.info("所属行业-- " + EM2016); //過戶機構 String SECURITY_TYPE = contentEles.get(1).children().get(1).text(); itemSummary.setSecurityType(SECURITY_TYPE); log.info("证券类型-- " + SECURITY_TYPE); //办公地址 String ADDRESS = contentEles.get(2).children().get(1).text(); itemSummary.setAddress(ADDRESS); log.info("办公地址-- " + ADDRESS); //注册地址 String REG_ADDRESS = contentEles.get(3).children().get(1).text(); itemSummary.setRegAddress(REG_ADDRESS); log.info("注册地址-- " + REG_ADDRESS); //公司電話 String ORG_TEL = contentEles.get(4).children().get(1).text(); itemSummary.setOrgTel(ORG_TEL); log.info("联系电话-- " + ORG_TEL); // 過戶電話 String ORG_FAX = contentEles.get(5).children().get(1).text(); itemSummary.setOrgFax(ORG_FAX); log.info("传真-- " + ORG_FAX); //公司邮箱 String ORG_EMAIL = contentEles.get(6).children().get(1).text(); itemSummary.setOrgEmail(ORG_EMAIL); log.info("公司邮箱-- " + ORG_EMAIL); //公司简介 主要經營業務 String BUSINESS_SCOPE = contentEles.get(7).children().get(1).text(); itemSummary.setBusinessScope(BUSINESS_SCOPE); log.info("主营业务-- " + BUSINESS_SCOPE); Elements sectionEles = doc.select("#tw-stock-tabs > div.jsx-3818843070.company-info > div > div:nth-child(3) > div.jsx-4082504959.content-container").get(0).children(); //實收資本額 String TOTAL_MARKET_CAP = sectionEles.get(0).children().get(1).text(); itemSummary.setSkMarketCap(TOTAL_MARKET_CAP); log.info("总市值-- " + TOTAL_MARKET_CAP); // 人均持股 String EPSJB = sectionEles.get(1).children().get(1).text(); itemSummary.setEps(EPSJB); log.info("基本每股收益-- " + EPSJB); //已發行股數 String ISSUED_COMMON_SHARES = sectionEles.get(2).children().get(1).text(); itemSummary.setCommonAcs(ISSUED_COMMON_SHARES); log.info("总股本-- " + ISSUED_COMMON_SHARES); // 外資持股 String DPS_HKD = sectionEles.get(3).children().get(1).text(); itemSummary.setDpsHkd(DPS_HKD); log.info("每股股息-- " + DPS_HKD); //股東人數 String EMP_NUM = sectionEles.get(4).children().get(1).text(); itemSummary.setEmpNum((EMP_NUM)); log.info("员工人数-- " + EMP_NUM); // 前十大持股 String PB_NEW_NOTICE = sectionEles.get(5).children().get(1).text(); itemSummary.setPbTtm(PB_NEW_NOTICE); log.info("市净率-- " + PB_NEW_NOTICE); // 特別股 String SALE_GPR = sectionEles.get(6).children().get(1).text(); itemSummary.setGrossProfitMargin(SALE_GPR); log.info("毛利率-- " + SALE_GPR); // 公債發行 String HOLDER_PROFIT = sectionEles.get(7).children().get(1).text(); itemSummary.setProfitParentCompany(HOLDER_PROFIT); log.info("归母净利润-- " + HOLDER_PROFIT); itemSummaryService.saveOrUpdate(itemSummary); } public void crawlETF(String symbol) { /** * */ String content = HttpHelper.sendGetHttp(String.format(etf_url, symbol.replace("SH", "").replace("SZ", "")), ""); if (content.contains("Internal Server Error.")) { log.error("{} 简况数据不存在", symbol); return; } ItemSummary itemSummary = itemSummaryService.getOrNewOne(symbol); // ItemSummary itemSummary = new ItemSummary(); itemSummary.setSymbol(symbol); Document doc = Jsoup.parse(content); Elements s2NameEles = doc.select("span.s2.f005"); Elements s5NameEles = doc.select("span.s5.f005"); Elements s4NameEles = doc.select("span.s4.f005"); //单位净值 String netUnitValue = doc.select("span.asset-value").get(0).text(); itemSummary.setNetUnitValue(netUnitValue); //净值增长率 String netWorthGrowthRate = doc.select("span.asset-amt").get(0).text(); itemSummary.setNetWorthGrowthRate(netWorthGrowthRate); //累计净值 String cumulativeNetWorth = doc.select("span.asset-all").get(0).text(); itemSummary.setCumulativeNetWorth(cumulativeNetWorth); //截止日期 String expirationDate = doc.select("span.date").get(0).text(); itemSummary.setExpirationDate(expirationDate); //最新估值 String latestValuation = doc.select("span.price").get(0).text(); itemSummary.setLatestValuation(latestValuation); //涨跌幅 String quoteChange = doc.select("span.amt").get(0).text(); itemSummary.setQuoteChange(quoteChange); //涨跌额 String changes = doc.select("span.amt-value").get(0).text(); itemSummary.setChanges(changes); //最新规模 String latestScale = doc.select("span.scale").get(0).text(); itemSummary.setLatestScale(latestScale); //申购状态 String subscriptionStatus = doc.select("span.subscribe-status").get(0).text(); itemSummary.setSubscriptionStatus(subscriptionStatus); //赎回状态 String redemptionStatus = doc.select("span.redeem-status").get(0).text(); itemSummary.setRedemptionStatus(redemptionStatus); // 公司名称 String orgName = s5NameEles.get(0).text(); itemSummary.setOrgName(orgName); log.info("公司名称-- " + orgName); String strNameA = s2NameEles.get(0).text(); itemSummary.setStrNameA(strNameA); log.info("公司简称-- " + orgName); // 所属地区 // itemSummary.setRegion("台湾省"); //基金代码 String secucode = s4NameEles.get(0).text(); itemSummary.setSecucode(secucode); //成立日期 String foundDate = s2NameEles.get(1).text(); itemSummary.setFoundDate(foundDate); //基金份额 String fundShares = s2NameEles.get(3).text(); itemSummary.setFundShares(fundShares); //基金规模 String fundSize = s2NameEles.get(4).text(); itemSummary.setFundSize(fundSize); //风险等级 String riskLevel = doc.select("span.risk").get(0).text(); itemSummary.setRiskLevel(riskLevel); //基金管理人 String legalRepresentative = s2NameEles.get(5).select("a").text(); itemSummary.setLegalRepresentative(legalRepresentative); //基金经理 String managingDirector = s2NameEles.get(6).select("a").text(); itemSummary.setManagingDirector(managingDirector); //基金类型 String securityType = s2NameEles.get(7).text(); itemSummary.setSecurityType(securityType); //投资目标 String investmentType = s5NameEles.get(1).text(); itemSummary.setInvestmentType(investmentType); //业绩比较基准 String performanceBenchmark = s5NameEles.get(2).text(); itemSummary.setPerformanceBenchmark(performanceBenchmark); //投资范围 String investmentPhilosophy = s5NameEles.get(3).text(); itemSummary.setInvestmentPhilosophy(investmentPhilosophy); //风险特征 String riskCharacteristics = s5NameEles.get(4).text(); itemSummary.setRiskCharacteristics(riskCharacteristics); //收益分配原则 String incomeDistributionPrinciple = s5NameEles.get(5).text(); itemSummary.setIncomeDistributionPrinciple(incomeDistributionPrinciple); itemSummaryService.saveOrUpdate(itemSummary); } public void crawlJP(String symbol) { String content = HttpHelper.sendGetHttp(jp_url.replace("{}", symbol.replace("jp", "")), ""); if (content.contains("Internal Server Error.")) { log.error("{} 简况数据不存在", symbol); return; } ItemSummary itemSummary = itemSummaryService.getOrNewOne(symbol); // ItemSummary itemSummary = new ItemSummary(); itemSummary.setSymbol(symbol); Document doc = Jsoup.parse(content); Elements hidden = doc.select("div.hidden"); Elements card = hidden.select("span.card-item"); //成交额 String operate_income = card.get(2).select("span").get(1).text(); itemSummary.setOperateIncome(operate_income); //总市值 String sk_market_cap = card.get(5).select("span").get(1).text(); itemSummary.setSkMarketCap(sk_market_cap); //市盈率TTM String gross_profit_margin = card.get(7).select("span").get(1).text(); itemSummary.setGrossProfitMargin(gross_profit_margin); //总股本 String common_acs = card.get(8).select("span").get(1).text(); itemSummary.setCommonAcs(common_acs); // //每股收益TTM // String basic_eps = card.get(10).select("span").get(1).text(); // itemSummary //流通值 String circulating_a_share_market_capitalization = card.get(11).select("span").get(1).text(); itemSummary.setCirculatingAShareMarketCapitalization(circulating_a_share_market_capitalization); //市盈率(静) String pe_ttm = card.get(13).select("span").get(1).text(); itemSummary.setPeTtm(pe_ttm); //流通股 String circulating_a_shares = card.get(14).select("span").get(1).text(); itemSummary.setCirculatingAShares(circulating_a_shares); //股息TTM String dps_hkd = card.get(15).select("span").get(1).text(); itemSummary.setDpsHkd(dps_hkd); //每股收益(静) String eps = card.get(16).select("span").get(1).text(); itemSummary.setEps(eps); //股息率TTM String dividend_rate = card.get(18).select("span").get(1).text(); itemSummary.setDividendRate(dividend_rate); //市净率 String pb_ttm = card.get(17).select("span").get(1).text(); itemSummary.setPbTtm(pb_ttm); //每手 String trade_unit = card.get(17).select("span").get(1).text(); itemSummary.setTradeUnit(trade_unit); Elements companyInfo = doc.select("div.company-info-item"); Map company = new HashMap<>(); for (Element element : companyInfo) { String key = element.select("span.title").text(); String value = element.select("span.value").text(); if (key.equalsIgnoreCase("公司网址")) { value = element.select("a.value").text(); } company.put(key, value); } //证券代码 String secucode = company.get("证券代码"); itemSummary.setSecucode(secucode); //公司名称 String org_name = company.get("公司名称"); itemSummary.setOrgName(org_name); //成立日期 String found_date = company.get("成立日期"); itemSummary.setFoundDate(found_date); //所属市场 String stock_exchange = company.get("所属市场"); itemSummary.setStockExchange(stock_exchange); //员工数量 String emp_num = company.get("员工数量"); itemSummary.setEmpNum(emp_num); //年结日 String year_settle_day = company.get("年结日"); itemSummary.setYearSettleDay(year_settle_day); //公司地址 String address = company.get("公司地址"); itemSummary.setAddress(address); //电话 String org_tel = company.get("电话"); itemSummary.setOrgTel(org_tel); //公司网址 String org_web = company.get("公司网址"); itemSummary.setOrgWeb(org_web); itemSummaryService.saveOrUpdate(itemSummary); } public static void main(String[] args) { // new SummaryCrawl().crawlAStock("SZ300750"); // new SummaryCrawl().crawlHkStock("00700"); // new SummaryCrawl().crawlTWStock("5434"); // new SummaryCrawl().crawlETF("SH513030"); new SummaryCrawl().crawlJP("jp4151"); } }