清空输入框通过分析代码可以得出:
- 请求地址:http://www.jsons.cn/banknum/
- 请求方式:POST
- 请求参数: keyword: 联行号txtflag :1
我们可以用PostMan来验证一下接口是否有效,验证结果如下图所示:

剩下的两个网站相对比较简单,只需要更改相应的联行号,进行请求就可以获取到相应的数据,所以这里不过多赘述。
爬虫编写
经过上面的分析了,已经取到了我们想要的接口,可谓是万事俱备,只欠代码了。爬取原理很简单,就是解析HTML元素,然后获取到相应的属性值保存下来就好了。由于使用Java进行开发,所以选用「Jsoup」来完成这个工作。
org.jsoupjsoup1.13.1
由于单个网站的数据可能不全,所以我们需要逐个进行抓取。先抓取第一个,如果抓取不到,则抓取下一个网站,这样依次进行下去。这样的业务场景,我们可以使用变种的责任链设计模式来进行代码的编写。
BankBranchVO支行信息
@Data@BuilderpublicclassBankBranchVO{privateStringbankName;privateStringbankCode;privateStringprovName;privateStringcityName;}
BankBranchSpider抽象类
publicabstractclassBankBranchSpider{privateBankBranchSpidernextSpider;protectedabstractBankBranchVOparse(StringbankBranchCode);publicvoidsetNextSpider(BankBranchSpidernextSpider){this.nextSpider=nextSpider;}protectedabstractbooleanuseNextSpider(BankBranchVOvo);publicBankBranchVOsearch(StringbankBranchCode){BankBranchVOvo=parse(bankBranchCode);while(useNextSpider(vo)&&this.nextSpider!=null){vo=nextSpider.search(bankBranchCode);}if(vo==null){thrownewSpiderException("无法获取支行信息:"+bankBranchCode);}returnvo;}}
针对不同的网站解析方式不太一样,简言之就是获取HTML标签的属性值,对于这步可以有很多种方式实现,下面贴出我的实现方式,仅供参考。
JsonCnSpider
@Slf4jpublicclassJsonCnSpiderextendsBankBranchSpider{privatestaticfinalStringURL="http://www.jsons.cn/banknum/";@OverrideprotectedBankBranchVOparse(StringbankBranchCode){try{log.info("json.cn-支行信息查询:{}",bankBranchCode);//设置请求参数Mapmap=newHashMap<>(2);map.put("keyword",bankBranchCode);map.put("txtflag","1");//查询支行信息Documentdoc=Jsoup.connect(URL).data(map).post();Elementstd=doc.selectFirst("tbody").selectFirst("tr").select("td");if(td.size()<3){returnnull;}//获取详情urlStringdetailUrl=td.get(3).selectFirst("a").attr("href");if(StringUtil.isBlank(detailUrl)){returnnull;}log.info("json.cn-支行详情-联行号:{},详情页:{}",bankBranchCode,detailUrl);//获取详细信息Elementsfooters=Jsoup.connect(detailUrl).get().select("blockquote").select("footer");StringbankName=footers.get(1).childNode(2).toString();StringbankCode=footers.get(2).childNode(2).toString();StringprovName=footers.get(3).childNode(2).toString();StringcityName=footers.get(4).childNode(2).toString();returnBankBranchVO.builder().bankName(bankName).bankCode(bankCode).provName(provName).cityName(cityName).build();}catch(IOExceptione){log.error("json.cn-支行信息查询失败:{},失败原因:{}",bankBranchCode,e.getLocalizedMessage());returnnull;}}@OverrideprotectedbooleanuseNextSpider(BankBranchVOvo){returnvo==null;}}
FiveCmSpider
@Slf4jpublicclassFiveCmSpiderextendsBankBranchSpider{privatestaticfinalStringURL="http://www.5cm.cn/bank/%s/";@OverrideprotectedBankBranchVOparse(StringbankBranchCode){log.info("5cm.cn-查询支行信息:{}",bankBranchCode);try{Documentdoc=Jsoup.connect(String.format(URL,bankBranchCode)).get();Elementstr=doc.select("tr");Elementstd=tr.get(0).select("td");if("".equals(td.get(1).text())){returnnull;}StringbankName=doc.select("h1").get(0).text();StringprovName=td.get(1).text();StringcityName=td.get(3).text();returnBankBranchVO.builder().bankName(bankName).bankCode(bankBranchCode).provName(provName).cityName(cityName).build();}catch(IOExceptione){log.error("5cm.cn-支行信息查询失败:{},失败原因:{}",bankBranchCode,e.getLocalizedMessage());returnnull;}}@OverrideprotectedbooleanuseNextSpider(BankBranchVOvo){returnvo==null;}}
AppGateSpider
@Slf4jpublicclassAppGateSpiderextendsBankBranchSpider{privatestaticfinalStringURL="https://www.appgate.cn/branch/bankBranchDetail/";@OverrideprotectedBankBranchVOparse(StringbankBranchCode){try{log.info("appgate.cn-查询支行信息:{}",bankBranchCode);Documentdoc=Jsoup.connect(URL+bankBranchCode).get();Elementstr=doc.select("tr");StringbankName=tr.get(1).select("td").get(1).text();if(Boolean.FALSE.equals(StringUtils.hasText(bankName))){returnnull;}StringprovName=tr.get(2).select("td").get(1).text();StringcityName=tr.get(3).select("td").get(1).text();returnBankBranchVO.builder().bankName(bankName).bankCode(bankBranchCode).provName(provName).cityName(cityName).build();}catch(IOExceptione){log.error("appgate.cn-支行信息查询失败:{},失败原因:{}",bankBranchCode,e.getLocalizedMessage());returnnull;}}@OverrideprotectedbooleanuseNextSpider(BankBranchVOvo){returnvo==null;}}
初始化爬虫
@ComponentpublicclassBankBranchSpiderBean{@BeanpublicBankBranchSpiderbankBranchSpider(){JsonCnSpiderjsonCnSpider=newJsonCnSpider();FiveCmSpiderfiveCmSpider=newFiveCmSpider();AppGateSpiderappGateSpider=newAppGateSpider();jsonCnSpider.setNextSpider(fiveCmSpider);fiveCmSpider.setNextSpider(appGateSpider);returnjsonCnSpider;}}
爬取接口
@RestController@AllArgsConstructor@RequestMapping("/bank/branch")publicclassBankBranchController{privatefinalBankBranchSpiderbankBranchSpider;@GetMapping("/search/{bankBranchCode}")publicBankBranchVOsearch(@PathVariable("bankBranchCode")StringbankBranchCode){returnbankBranchSpider.search(bankBranchCode);}}
演示
爬取成功


爬取失败的情况

代码地址
- https://gitee.com/huangxunhui/java-spider-data.git
总结
这个爬虫的难点主要是在于Jsons.cn。因为数据接口被隐藏在代码里面,所以想取到需要花费一些时间。并且请求地址和页面地址一致,只是请求方式不一样,容易被误导。比较下来其他的两个就比较简单,直接替换联行号就可以了,还有就是这个三个网站也没啥反扒的机制,所以很轻松的就拿到了数据。
本文关键词:查行号最简单方法,工商银行联行号怎么查询,联行号是什么意思和开户行行号,联行号在哪里看,怎么查询自己银行卡的联行号。这就是关于《联行号是什么,如何快速查询银行行号(实战通过联行号爬取支行信息)》的所有内容,希望对您能有所帮助!
本文链接:https://bk.89qw.com/a-490744/