Springboot+Jsoup爬取数据

工具类

我用的是谷歌,这里放的是浏览器的user-agent: 在这里插入图片描述

 private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36";

请求方法,拿到你要的爬取数据的界面,传入你自己需求的界面Url(网上很多模板)

  public static String sendGet(String url) {
        //1.生成httpclient,相当于该打开一个浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //设置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
        CloseableHttpResponse response = null;
        String html = null;
        //2.创建get请求,相当于在浏览器地址栏输入 网址
        HttpGet request = new HttpGet(url);
        try {
            request.setHeader("User-Agent", USER_AGENT);
            request.setConfig(requestConfig);
            //3.执行get请求,相当于在输入地址栏后敲回车键
            response = httpClient.execute(request);
            //4.判断响应状态为200,进行处理
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                //5.获取响应内容
                HttpEntity httpEntity = response.getEntity();
                html = EntityUtils.toString(httpEntity, "GBK");
            } else {
                //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                System.out.println("返回状态不是200");
                System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //6.关闭
            HttpClientUtils.closeQuietly(response);
            HttpClientUtils.closeQuietly(httpClient);
        }
        return html;
    }

下面就是传入Url,用Jsoup对拿到的数据就行解析

       String detail = HttpClientDownPage.sendGet("https://www.ip138.com/iplookup.asp?ip=114.80.132.136&action=2");
        //通过Jsoup进行页面解析
        Document document = Jsoup.parse(detail);

因为我也是第一次用Jsoup,踩了很多坑,因为我这边要拿的是script下的数据,所以不能用这个,这个是拿div下Class目录下的数据

Elements postItems =document.getElementsByClass("table-inner");

我拿的是script下的数据,数据拿出来可以放入Map,也可以用json,代码如下

  Elements e = document.getElementsByTag("script").eq(1);
  //        Map map = new LinkedHashMap();

        for (Element element : e) {
            String[] data = element.data().toString().split("var");
            for (String variable : data) {
                if (variable.contains("=")) {
                    if (variable.contains("ip_result")) {
                        String[] kvp = variable.split("=");
//                        if (!map.containsKey(kvp[0].trim()))
//                            map.put(kvp[0].trim(), kvp[1].trim().substring(0, kvp[1].trim().length() - 2).toString());

                        JSONObject jsonObject = new JSONObject(kvp[1].trim());

                        String ip=jsonObject.getString("iP段");
                        System.out.println(ip + "数据");
//                        String ipStart=ip.substring(0,13);
//                        String ipStop=ip.substring(16,31);
//                        System.out.println(map + "数据");
                        JSONArray jsonArray = jsonObject.getJSONArray("ip_c_list");
                        for (int j = 0; j < jsonArray.length(); j++) {
                            JSONObject jsonObject2 = jsonArray.getJSONObject(j);
                            String yunyin = jsonObject2.getString("yunyin");
                            String net = jsonObject2.getString("net");
                            String wl =yunyin+net;
                            System.out.println(wl+"云");
                        }
                        }
                    }
                }
            }

解释一下部分代码

//getElementsByTag("script").eq(1)拿到的这个是整个界面中第几个script下的数据
Elements e = document.getElementsByTag("script").eq(1);
//这个地方拿到是你script下面你需要的var数据
variable.contains("ip_result")

差不多就是些了,因为也是第一次用,写下来记录一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值