归集跳行数据公式(实战通过联行号爬取支行信息)
归集跳行数据公式(实战通过联行号爬取支行信息)
2024-07-06 03:56:14  作者:格雷福斯  网址:https://m.xinb2b.cn/know/vmo518284.html

归集跳行数据公式(实战通过联行号爬取支行信息)(1)

前言

  经过一段时间的加班,终于是把项目熬上线了。本以为可以轻松一点,但往往事与愿违,出现了各种各样的问题。由于做的是POS前置交易系统,涉及到和商户进件以及交易相关的业务,需要向上游支付机构上送“联行号”,但是由于系统内的数据不全,经常出现找不到银行或者联行号有误等情况,导致无法进件。

  为了解决这个问题,我找上游机构要了一份支行信息。好家伙,足足有14w条记录。在导入系统时,发现有一些异常的数据。有些是江西的银行,地区码竟然是北京的。经过一段时间排查,发现这样的数据还挺多的。这可愁死我了,本来偷个懒,等客服反馈的时候,出现一条修一条。

  经过2分钟的思考,想到以后每天都要修数据,那不得烦死。于是长痛不如短痛,还不如一次性修了。然后我反手就打开了百度,经过一段时间的遨游。发现下面3个网站的支行信息比较全,准备用来跟系统内数据作对比,然后进行修正。

http://www.jsons.cn/banknum/http://www.5cm.cn/bank/支行编号/https://www.appgate.cn/branch/bankBranchDetail/支行编号分析网站

归集跳行数据公式(实战通过联行号爬取支行信息)(2)

  输入联行号,然后选择查询方式,点击开始查询就可以。但是呢,结果页面一闪而过,然后被广告页面给覆盖了,这个时候就非常你的手速了。对于这样的,自然是难不倒我。从前端的角度分析,很明显展示结果的table标签被隐藏了,用来显示广告。于是反手就是打开控制台,查看源代码。

归集跳行数据公式(实战通过联行号爬取支行信息)(3)

经过一顿搜寻,终于是找到了详情页的地址。

归集跳行数据公式(实战通过联行号爬取支行信息)(4)

  通过上面的操作,我们要想爬到数据,需要做两步操作。先输入联行号进行查询,然后进去详情页,才能取到想要的数据。所以第一步需要先获取查询的接口,于是我又打开了熟悉的控制台。

归集跳行数据公式(实战通过联行号爬取支行信息)(5)

  从上图可以发现这些请求都是在获取广告,并没有发现我们想要的接口,这个是啥情况,难道凭空变出来的嘛。并不是,主要是因为这个网站不是前后端分离的,所以这个时候我们需要从它的源码下手。

归集跳行数据公式(实战通过联行号爬取支行信息)(6)

<html><body><formid="form1"class="form-horizontal"action="/banknum/"method="post"><divclass="form-group"><labelclass="col-sm-2control-label">关键词:</label><divclass="col-sm-10"><inputclass="form-control"type="text"id="keyword"name="keyword"value="102453000160"placeholder="请输入查询关键词,例如:中关村支行"maxlength="50"/></div></div><divclass="form-group"><labelclass="col-sm-2control-label">搜索类型:</label><divclass="col-sm-10"><selectclass="form-control"id="txtflag"name="txtflag"><optionvalue="0">支行关键词</option><optionvalue="1"selected="">银行联行号</option><optionvalue="2">支行网点地址</option></select></div></div><divclass="form-group"><labelclass="col-sm-2control-label"></label><divclass="col-sm-10"><buttontype="submit"class="btnbtn-success">开始查询</button><ahref="/banknum/"class="btnbtn-danger">清空输入框</a></div></div></form></body></html>

通过分析代码可以得出:

请求地址:http://www.jsons.cn/banknum/请求方式:POST请求参数: keyword: 联行号txtflag :1

我们可以用PostMan来验证一下接口是否有效,验证结果如下图所示:

归集跳行数据公式(实战通过联行号爬取支行信息)(7)

  剩下的两个网站相对比较简单,只需要更改相应的联行号,进行请求就可以获取到相应的数据,所以这里不过多赘述。

爬虫编写

  经过上面的分析了,已经取到了我们想要的接口,可谓是万事俱备,只欠代码了。爬取原理很简单,就是解析HTML元素,然后获取到相应的属性值保存下来就好了。由于使用Java进行开发,所以选用「Jsoup」来完成这个工作。

<!--HTML解析器--><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</version></dependency>

  由于单个网站的数据可能不全,所以我们需要逐个进行抓取。先抓取第一个,如果抓取不到,则抓取下一个网站,这样依次进行下去。这样的业务场景,我们可以使用变种的责任链设计模式来进行代码的编写。

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);//设置请求参数Map<String,String>map=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);}}

演示

爬取成功

归集跳行数据公式(实战通过联行号爬取支行信息)(8)

归集跳行数据公式(实战通过联行号爬取支行信息)(9)

爬取失败的情况

归集跳行数据公式(实战通过联行号爬取支行信息)(10)

代码地址https://gitee.com/huangxunhui/java-spider-data.git总结

   这个爬虫的难点主要是在于Jsons.cn。因为数据接口被隐藏在代码里面,所以想取到需要花费一些时间。并且请求地址和页面地址一致,只是请求方式不一样,容易被误导。比较下来其他的两个就比较简单,直接替换联行号就可以了,还有就是这个三个网站也没啥反扒的机制,所以很轻松的就拿到了数据。

往期回顾「实战省市区三级联动数据爬取」结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

  • 正确有效的美白方法(5个全身美白小技巧)
  • 2024-07-065个全身美白小技巧#时尚官看点#不管是普通人还是明星,白到发光的人无论走到哪里都能吸引到很多人的目光我们中国人的肤色大部分发黄,但是也总会一小部分人凭着后天的努力,改变了自己的肤色,成为人人羡慕的对象今天,小编给大家整。
  • 减脂期怎样才能吃够热量了(减脂误区只看热量)
  • 2024-07-06减脂误区只看热量认真的减脂人群非常愿意给自己制作减肥食谱,就是根据每个人不同的身体状况计算出每天应该摄入多少热量,然后安排出每一餐要吃哪些东西去满足这个需求(发现没,这个计划就非常有问题)这个习惯对于新手们了解自己的。
  • 灯槽灯带安装方法图解(步骤阅读)
  • 2024-07-06步骤阅读首先确定一下要安装的长度,然后取整数截取因为这种灯带是1米一个单元,只有从剪口截断,才不会影响电路,如果随意剪断,会造成一个单元不亮LED本身是二极管,直流电驱动,所以是有正负极的,如果正负极反接,就。
  • 马克龙中法国旗(马克龙悄悄更换了法国国旗颜色)
  • 2024-07-06马克龙悄悄更换了法国国旗颜色据英国广播公司(BBC)14日消息,法国官员告诉当地媒体称,法国总统马克龙目前已使用“怀旧版”法国国旗,三色旗是海军蓝不是亮蓝图/ICPhoto据法国媒体报道,从去年起,法国总统府爱丽舍宫、国民议会、。
  • 怎样分辨真假山茶油的区别(山茶油如何区分好坏)
  • 2024-07-06山茶油如何区分好坏茶油,是油茶籽油的俗称,又名山茶油、山茶籽油,是从山茶科山茶属植物的普通油茶成熟种子中提取的纯天然高级食用植物油,色泽金黄或浅黄,品质纯净,澄清透明,气味清香,味道纯正很多人把橄榄油拿来与山茶油进行对。
  • 陈情令一周年纪念日祝词(陈情令一周年纪念日祝词介绍)
  • 2024-07-06陈情令一周年纪念日祝词介绍6.27纪念阿令开播一周年,又来打卡啦!播放量已破80亿,继续向前,不止于前!奥利给627开播一周年,阿令真香!《陈情令》太牛了!太激动了,希望这部电视剧可以上星播放,阿令冲鸭激动的心,颤抖的手,不回。
  • 6年级下册英语第三单元测试卷(六年级下英语第三单元测试卷)
  • 2024-07-06六年级下英语第三单元测试卷这是一份侧重基础知识考查的过关检测卷,分听力30分十笔试70分,听力需要录音的朋友私信留言私发一起来看看:01拿到卷子最好是能抽时间把听力题目过一遍,做到心中有数听力部分录音具体内容如下:一、此题考查。
  • 剑桥英语考试最新消息 阅读写作等学科类兴趣班
  • 2024-07-06剑桥英语考试最新消息 阅读写作等学科类兴趣班都市快报讯8月24日,萧山区青少年宫发布秋季报名公告,公告中明确:为贯彻落实中共中央办公厅、国务院办公厅《关于进一步减轻义务教育阶段学生作业负担和校外培训负担的意见》,经研究决定,萧山区青少年宫秋季剑。
  • 现实生活中的爱狗人士有哪些(人生有很多想不到)
  • 2024-07-06人生有很多想不到接连发生的摔狗、打狗事件,街头日益增多的流浪狗,以及网上对“爱狗一族”的挞伐深感如此下去,人和狗将渐行渐远除了养狗的规范化、倡扬养狗道德之外,亟需消弥养狗人和非养狗人之间的鸿沟有人说:与其养狗,不如多。
  • 致90后入职青年(95后大学生致信99后打工者)
  • 2024-07-0695后大学生致信99后打工者曾经有人说,“95后”是“90后”的升级版他们是特立独行的一代,拒绝任何标签,也更加难以定义今天的“95后”,有的还在读书深造,对未来有无限遐想;有的已初入社会,早早体验世间百态但无论如何,他们都是代。
  • 三德子是什么官职(三德子)
  • 2024-07-06三德子乡村爱(乱)情之三德子三德子,是我亲堂哥他哥四个,排行老三,小名德(dei)子我爷爷那辈,独他一个据说是和我瞎眼的老奶奶相依为命(老辈的事我也不知道,很奇怪我们王家是一个大家,为啥爷爷是个独生子!)爷。
  • 唐嫣燕云台美照 她比燕云台里的唐嫣精致更多
  • 2024-07-06唐嫣燕云台美照 她比燕云台里的唐嫣精致更多我这几天追剧《燕云台》,把蒋胜男老师的同名小说再次拿出来翻看,也有读者问:辽代使用的装饰和物品真的像电视剧里那么金碧辉煌吗?那咱们今天就去中国最不容错过的博物馆——辽宁博物馆,去看看辽代和宋代的稀罕物。