工具类
我用的是谷歌,这里放的是浏览器的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")
差不多就是些了,因为也是第一次用,写下来记录一下