Van様 2022-03-04 07:53 采纳率: 33.3%
浏览 59
已结题

抓取接口返回信息为空的问题

最近做的一个从王者营地荣耀榜里抓取数据的功能,需要修改参数并多次向他们的接口发送请求,刚开始还可以正常获取到,但是等到请求100多次之后,就获取不到信息了,这个时候停掉请求,等过一会不做任何修改就又能获取到了,这个是怎么回事呢,我想不间断的一直发请求,直到循环结束,以快速拿到数据。有没有仁兄指点一波,下面是主要代码

public void testPost(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException {
        //开始时间
        long start = System.currentTimeMillis();
        List<Hero> listsHero = heroMapper.selectHeroAll();
        List<Area> listsArea = areaMapper.selectAreaAll();

        //三层循环第一层是大区,第二层是英雄,第三层是地区
        for (Constant.Server server:Constant.Server.values() ) {
            for (Hero hero:listsHero ) {
                for (Area area:listsArea ) {
                    doKingInfoGet(hero,area,server);
                }
            }

        }
        //结束时间
        long end = System.currentTimeMillis();
        String timeDiff = Tool.timeDiff(start,end);
        System.out.println("最终耗时:" + timeDiff);
    }

    private void doKingInfoGet(Hero hero, Area area, Constant.Server server) throws IOException {
        String url = Constant.KING_URL;//王者战力接口

        URL realUrl = new URL(url);
        // 打开和URL之间的连接
        HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();

        //设置消息头
        setConnParam(conn);
        //获取参数模板
        String param = Tool.getResourceString(Constant.JSON_RES_PATH);

        //模板转map准备替换参数
        HashMap map = Tool.jsonString2Map(param);;

        //替换参数
        map.replace(Constant.Parameter.heroId,hero.getHeroId());
        map.replace(Constant.Parameter.adcode,area.getAreaId());
        map.replace(Constant.Parameter.areaId,server.getValue());
        //换参结束后转为String直接做参数发送请求
        param = Tool.map2JsonString(map);

        //获取返回体
        String result = getReturnBody(conn,param);
        if(result == null || "".equals(result.trim())){
            System.out.println(area.getAreaId()+Constant.SPACE+area.getAreaName()+"未获取到战力信息!");
            return;
        }
        map = Tool.jsonString2Map(result);
        //如果returnCode等于0,则请求成功
        if((Integer) map.get(Constant.Parameter.returnCode) == 0 ){

        }

    }

展开全部

  • 写回答

5条回答 默认 最新

  • CSDN专家-sinJack 2022-03-04 08:03
    关注

    访问有限制。限制同一个ip一定时间内访问次数。
    加线程睡眠,间隔执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    Van様 2022-03-04 08:19

    感谢回答,不过我算了一下,这些循环跑完的话要100多万次,加睡眠太影响效率了,有没有不加睡眠的办法呢,并且请求100多次后的限制IP时间很久,大概要一个多小时

    回复
    Van様 回复 CSDN专家-sinJack 2022-03-04 08:35

    虚拟IP也不行,刚才试了一下,还是到次数就被限制了,有点头大

    回复
    展开全部5条评论
查看更多回答(4条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月4日
  • 创建了问题 3月4日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部