最新要闻
- 神舟十六号发射圆满成功:大红屏再次点亮 环球新资讯
- 全脂/低脂可选:特仑苏纯牛奶2.7元/盒大促(商超6元)
- 中科院院士:电动车主可以往外卖电 一年能卖4000元-焦点简讯
- 世界短讯!“十项全能”是怎样一种体验?华为Mate X3绝对是大屏折叠旗舰天花板
- 世界视点!小米MIX Fold 3曝光:屏下摄像头+潜望长焦 再无短板
- 每日热讯!电力板块异动拉升 世茂能源两连板
- 最野性的福特SUV!探险者昆仑巅峰版上市:售39.98万
- 新资讯:媒体评“剩菜盲盒”被疯抢 越来越多年轻人喜爱:便宜、杜绝浪费食品
- 荣耀赵明:MagicOS 8.0会有巨大进步 某些层面跟鸿蒙流畅性不相上下-环球快资讯
- 天天实时:给老外来点中国车 比亚迪ATTO 3成海外多国销冠:跻进全球前10
- 每日简讯:PS5国内白菜价:但PS5游戏盘开始涨价了
- 天天快资讯丨找数字专注力训练(找数字)
- 每日头条!刚被微软夸史上最可靠系统 Win11又惹祸:AMD显卡中招
- 天天讯息:知名电竞解说Yammers自杀 留遗书称曾遭霸凌:玩家晒视频怀念 再见了宝贝
- 国产电商二手剪辑卖货 拿捏欧美老外
- 女子用餐被收700元服务费却无服务 官方回应1对1管家服务:网友感慨
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
(Java)记一次通过API递归分页“爬取”网页数据的开发经历
前言
在最近的互联网项目开发中,需要获取用户的访问ip信息进行统计的需求,用户的访问方式可能会从微信内置浏览器、Windows浏览器等方式对产品进行访问。
当然,获取这些关于ip的信息是合法的。但是,这些ip信息我们采用了其它第三方的服务来记录,并不在我们的数据库中。
(资料图)
这些ip信息是分组存放的,且每个分组都都是分页(1页10条)存放的,如果一次性访问大量的数据,API很有可能会报错。
怎样通过HTTP的方式去获取到信息,并且模拟浏览器每页每页获取10条的信息,且持久到数据库中,就成了当下亟需解决的问题。
通过以上的分析,可以有大致以下思路:
1、拿到该网页http请求的url地址,同时获取到调用该网页信息的参数(如:header、param等);
2、针对分页参数进行设计,由于需要不断地访问同一个接口,所以可以用循环+递归的方式来调用;
3、将http接口的信息进行解析,同时保证一定的访问频率(大部分外部http请求都会有访问频率限制)让返回的数据准确;
4、整理和转化数据,按照一定的条件,批量持久化到数据库中。
一、模拟http请求
我们除了在项目自己写API接口提供服务访问外,很多时候也会使用到外部服务的API接口,通过调用这些API来返回我们需要的数据。
如:
钉钉开放平台https://open.dingtalk.com/document/orgapp/user-information-creation、
微信开放平台https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN等等进行开发。
这里分享一下从普通网页获取http接口url的方式,从而达到模拟http请求的效果:以谷歌chrome浏览器为例,打开调式模式,根据下图步骤:尤其注意使用Fetch/XHR,右键该url—>copy—>copy as cURL(bash):随后粘贴到Postman中,模拟http请求:粘贴的同时,还会自动带上header参数(以下这4个参数比较重要,尤其是cookie):这样,就可以访问到所需的数据了,并且数据是json格式化的,这便于我们下一步的数据解析。
二、递归+循环设计
有几个要点需要注意:1、分内外两层,内外都需要获取数据,即外层获取的数据是内层所需要的;2、每页按照10条数据来返回,直到该请求没有数据,则访问下一个请求;3、递归获取当前请求的数据,注意页数的增加和递归终止条件。废话不多说,直接上代码:
点击查看代码
public boolean getIpPoolOriginLinksInfo(HashMap commonPageMap, HashMap headersMap,String charset){ //接口调用频率限制 check(commonAPICheckData); String linkUrl = "https://xxx.xxx.com/api/v1/xxx/xxx"; HashMap linkParamsMap = new HashMap<>(); linkParamsMap.put("page",commonPageMap.get("page")); linkParamsMap.put("size",commonPageMap.get("size")); String httpLinkResponse = null; //封装好的工具类,可以直接用apache的原生httpClient,也可以用Hutool的工具包 httpLinkResponse = IpPoolHttpUtils.doGet(linkUrl,linkParamsMap,headersMap,charset); JSONObject linkJson = null; JSONArray linkArray = null; linkJson = JSON.parseObject(httpLinkResponse).getJSONObject("data"); linkArray = linkJson.getJSONArray("resultList"); if (linkArray != null){ //递归计数 if (!commonPageMap.get("page").toString().equals("1")){ commonPageMap.put("page","1"); } // 每10条urlId,逐一遍历 for (Object linkObj : linkJson.getJSONArray("resultList")) { JSONObject info = JSON.parseObject(linkObj.toString()); String urlId = info.getString("urlId"); // 获取到的每个urlId,根据urlId去获取ip信息(即内层的业务逻辑,我这里忽略,本质就是拿这里的参数传到内层的方法中去) boolean flag = getIpPoolOriginRecords(urlId, commonPageMap, headersMap, charset); if (!flag){ break; } } Integer page = Integer.parseInt(linkParamsMap.get("page").toString()); if (page <= Math.ceil(Integer.parseInt(linkJson.getString("total"))/10)){ Integer newPage = Integer.parseInt(linkParamsMap.get("page").toString()) + 1; linkParamsMap.put("page", Integer.toString(newPage)); // 递归分页拉取 getIpPoolOriginLinksInfo(linkParamsMap,headersMap,charset); } else { return true; } } return true; }
三、解析数据(调用频率限制)
一般来说,调用外部API接口会有调用频率的限制,即一段时间内不允许频繁请求接口,否则会返回报错,或者禁止调用。基于这样的限制,我们可以简单设计一个接口校验频率的方法,防止请求的频率太快。废话不多说,代码如下:
点击查看代码
/** * 调用频率校验,按照分钟为单位校验 * @param commonAPICheckData */ private void check(CommonAPICheckData commonAPICheckData){ int minuteCount = commonAPICheckData.getMinuteCount(); try { if (minuteCount < 2){ //接近频率限制时,休眠2秒 Thread.sleep(2000); }else { commonAPICheckData.setMinuteCount(minuteCount-1); } } catch (InterruptedException e) { throw new RuntimeException("-------外部API调用频率错误!--------"); } }
点击查看代码
@Datapublic class CommonAPICheckData { /** * 每秒调用次数计数器,限制频率:每秒钟2次 */ private int secondCount = 3; /** * 每分钟调用次数计数器,频率限制:每分钟100次 */ private int minuteCount = 100;}
四、数据持久化
爬出来的数据我这里是按照一条一条入库的,当然也可以按照批次进行batch的方式入库:
点击查看代码
/** * 数据持久化 * @param commonIpPool */ private boolean getIpPoolDetails(CommonIpPool commonIpPool){ try { //list元素去重,ip字段唯一索引 commonIpPoolService.insert(commonIpPool); } catch (Exception e) { if (e instanceof DuplicateKeyException){ return true; } throw new RuntimeException(e.getMessage()); } return true; }
五、小结
其实,爬取数据的时候我们会遇到各种各样的场景,这次分享的主要是分页递归的相关思路。有的时候,如果网页做了防爬的功能,比如在header上加签、访问前进行滑动图片校验、在cookie上做加密等等,之后有时间还会接着分享。代码比较粗糙,如果大家有其它建议,欢迎讨论。如有错误,还望大家指正。
关键词:
(Java)记一次通过API递归分页“爬取”网页数据的开发经历
神舟十六号发射圆满成功:大红屏再次点亮 环球新资讯
全脂/低脂可选:特仑苏纯牛奶2.7元/盒大促(商超6元)
中科院院士:电动车主可以往外卖电 一年能卖4000元-焦点简讯
世界短讯!“十项全能”是怎样一种体验?华为Mate X3绝对是大屏折叠旗舰天花板
世界视点!小米MIX Fold 3曝光:屏下摄像头+潜望长焦 再无短板
每日热讯!电力板块异动拉升 世茂能源两连板
企业内训一体化解决方案,布道师教学实训云平台【开源版上线】|今日热闻
世界快报:JS中的事件监听
最野性的福特SUV!探险者昆仑巅峰版上市:售39.98万
新资讯:媒体评“剩菜盲盒”被疯抢 越来越多年轻人喜爱:便宜、杜绝浪费食品
荣耀赵明:MagicOS 8.0会有巨大进步 某些层面跟鸿蒙流畅性不相上下-环球快资讯
天天实时:给老外来点中国车 比亚迪ATTO 3成海外多国销冠:跻进全球前10
每日简讯:PS5国内白菜价:但PS5游戏盘开始涨价了
MongoDB学习笔记:配置文件-世界今热点
天涯神贴合集(2023最新)
天天快资讯丨找数字专注力训练(找数字)
每日头条!刚被微软夸史上最可靠系统 Win11又惹祸:AMD显卡中招
天天讯息:知名电竞解说Yammers自杀 留遗书称曾遭霸凌:玩家晒视频怀念 再见了宝贝
国产电商二手剪辑卖货 拿捏欧美老外
女子用餐被收700元服务费却无服务 官方回应1对1管家服务:网友感慨
如何强制删除电脑文件内容(如何强制删除电脑文件)
收益率持续下行 同业存单市场走牛
世界快资讯丨【读财报】19家民营银行财报透视:网商银行、华瑞银行、新网银行不良率居前三
无敌性价比、能灭Zen4全家桶 Intel 14核酷睿i5-13600KF到手1969元
SSD大牌被卷到!铠侠RC20史低价:1TB 299元/2TB 599元
【世界新要闻】神舟十六号即将发射!三位航天员亮相出征仪式:要出差半年
天天热讯:今年最强LCD手机!Redmi Note 12T Pro游戏实测:《王者》《原神》几乎满帧
全球观点:是否具有派遣资格是什么意思_是否具有派遣资格
读数据压缩入门笔记02_二进制和熵
计划2030年前实现中国人登月 马斯克:中国航天比多数人想象得要强大
女子骨折做手术后左腿变长2.3厘米:鉴定十级伤残 医院拒赔
产油大国起内讧:俄罗斯低价供应大量石油 沙特都顶不住了|独家焦点
5月29日基金净值:信诚量化阿尔法股票A最新净值1.4838,跌0.3% 全球通讯
找狗(关于找狗的基本详情介绍) 当前最新
有这么个神人:被毒蛇咬173次 长期注射蛇毒 活了101岁
Flash死了!但小时候玩过的游戏 还不想死
地铁上 女子充电宝突然爆炸!现场烟雾弥漫
今晚油价或迎年内第四涨!加满一箱多花3.5元
3300秒!我国未来载人登月火箭主力发动机单台试车时长创新纪录 焦点滚动
【环球热闻】111完美邮箱_1163 com邮箱
【港股通】国泰航空(00293)据报接近订购波音777-8F货机-环球时快讯
土耳其总统埃尔多安再次赢得大选,将再度连任,外交部回应
5月29日基金净值:南方荣光A最新净值1.523,涨0.07% 当前观点
里程碑博士_里程碑的意思_今日看点
速看:武汉洪山融创智谷举办首届菁英联谊会,青年男女开启甜蜜之旅
黄果树天星洞景区小孩敲断钟乳石 工作人员称会尽快处理进行追责
国产动漫《斗罗大陆》终于迎来大结局 堪称“电影级”观影体验
德国一模特通过断骨增高将自己的身高从163增加至180厘米 手术风险极大
阿根廷国家队公布最新一期球队大名单 将由梅西与迪玛利亚领衔
东航全球首架交付国产大飞机C919顺利抵达 全球首次商业载客飞行成功
天天观点:淘宝账号登陆失败怎么回事_我的淘宝账户登录
2023.5.29Linux系统压缩打包|今日看点
环球看点!蚕豆迎丰收 “公司+专业合作社+农户”模式助农增收
蒙牛乳业宁夏工厂正式落成投产 为全球首座乳业全数智化工厂-天天快报
华硕发布49英寸QD-OLED带鱼屏显示器:5K分辨率 1000nits亮度
热点评!童年回忆满满 《王者荣耀》三款电玩新皮肤来了
全球今亮点!能玩破解游戏!任天堂回应下架《海豚模拟器》
全球快看点丨红蜘蛛新一代校色仪Spyder X2/X2 Ultra发布:最高支持2000nit亮度
今日看点:12)自定义函数
文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题 天天实时
【时快讯】100克黄焖鸡调料可以做几斤鸡肉?
Intel底层技术加持、腾讯应用宝登陆电脑:安卓应用完美移植PC 更有神器辅助 世界通讯
重回线下!2023 ChinaJoy官宣:7月28日上海见
全球快讯:让利16亿卖爆!小米618天猫预售战报出炉:订单金额超6亿拿下冠军
手机意外跌落损坏 小米工程师力保数据 女米粉写信感谢:还买小米 即时
全球要闻:SpringBoot集成Swagger3.0(详细)
世界速读:对话丨财通基金朱海东:市场情绪影响沪深300近期走势,仍看好A股
全球观点:19岁MIT辍学,26岁的他干出个500亿独角兽
Win11 23H2更新确认秋季推出!功能更新数量少了
世界微速讯:你会买么?调查显示超76%玩家不看好索尼新掌机
世界聚焦:Doris(三) -- Rollup和物化视图
《小美人鱼》在多国遭遇集体刷差评 女主假发造价15万美元
不是手游、不抽角色!国产大作《影之刃零》官宣为买断单机游戏|快播报
天天微动态丨日版任天堂Switch OLED版618抄底价:到手1817元
时讯:余承东放出豪言:问界年产上千万 做世界第一
快看:充满80%仅需30分钟!7座理想4C超级充电站上线
天天热点评!【一步步开发AI运动小程序】九、姿态辅助调试桌面工具折使用
刷爆的“信用卡”——起底美国债务危机_全球最资讯
每日聚焦:深交所:调整深证成指、创业板指、深证100等指数样本股
打造全国一流职教发展共同体,深职院与深圳二职签约合作办学
有梦想就了不起!高考307分女孩考研逆袭211:还将继续攻读博士
累计被扣78分 男子酒驾被查:自述“我平时是个老实人”
全球时讯:血糖健康开拓者!华为WATCH4 Pro评测:全面的腕上守护专家
女性出现这7个症状要小心尿路感染:再忙也要去医院看看!-世界速递
全球头条:山东一公司要求员工签自愿放弃社保承诺书 同事:不签担心被挤兑
2023天津和平四平东道小学转学通知
11)MySQL编程基础
【Oracle impdp/expdp】Big lesson from failure with impdp/expdp in 12c 焦点要闻
交易商协会:一季度债市信评调整次数下降 负面调整占七成-今日热讯
LCD小金刚!Redmi Note 12T Pro配备12GB大内存、5080mAh电池
iPhone 16 Pro机型屏幕为6.3和6.9英寸 为啥手机屏越来越大? 今日热讯
世界今日报丨2999元起 魅族20斩获京东预售销量TOP4:三年质保行业罕见
苹果WWDC 2023来了!iOS 17把短板都消灭干净了
618会员抄底:百度/腾讯/QQ/京东/B站/爱奇艺等大促合集-环球头条
东莞景湖装饰,家居装修达人_世界报道
Angular Highcharts教程_编程入门自学教程_菜鸟教程-免费教程分享
2、AS400 开发环境
每天一个Linux命令-gunzip. 每日看点
当前聚焦:揭秘“AI换脸”诈骗背后,黑灰产使用的手段