近期在做数据抓取功能,抓取到的数据为html格式,需在后台进行转换后取值,为了避免使用字符串查找方式获取而使用Jsonp完美实现。
1. 引入Jsonp:
1 <dependency> 2 <groupId>org.jsoup</groupId> 3 <artifactId>jsoup</artifactId> 4 <version>1.11.2</version> 5 </dependency>
2. 进行数据转换:
2.1 select可以获取HTML标签,类型为Elements;
2.2 child(int index) 可以根据坐标获取子标签;
2.3 text()可以获取便签内容。
1 // 解析返回数据 2 try { 3 Document doc = Jsoup.parse(result); 4 // 获取响应内容指定区域标签 5 Elements elements = doc.select(".BOC_main").select("tr"); 6 // 获取具体值 7 text = elements.get(1).child(6).text(); 8 } catch(Exception e) { 9 e.printStackTrace(); 10 }
3. 抓取数据方法:
其中,请求属性要根据实际情况修改。
private static String getUrlInfo(String url, String methodType, String param){ try { URL url = new URL(urls); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置连接超时时间 conn.setConnectTimeout(60000); // 设置读取超时时间 conn.setReadTimeout(60000); if("Get".equalsIgnoreCase(methodType)) { conn.setRequestMethod("GET"); }else { conn.setRequestMethod("POST"); } // 设置请求属性 conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Host", "host"); conn.setDoInput(true); conn.setDoOutput(true); // 设置是否使用缓存 conn.setUseCaches(false); if(StringUtil.isNotBlank(param)) { // 建立输入流,向指向的URL传入参数 DataOutputStream dos=new DataOutputStream(conn.getOutputStream()); dos.writeBytes(param); dos.flush(); dos.close(); } // 输出返回结果 InputStream input = conn.getInputStream(); int resLen =0; byte[] res = new byte[1024]; StringBuilder sb=new StringBuilder(); while((resLen=input.read(res))!=-1){ sb.append(new String(res, 0, resLen)); } return sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; }