Java爬虫
背景:工作当中多多少少需要从互联中获取一些信息,听得最多的爬虫语言是python,但为了爬一些信息,重新投入学习它,有点得不偿失。Java也可以是实现信息的爬去,这里主要介绍并总结JSOUP框架下的爬虫
解析html熟悉api
利用jsoup解析html文本,也算是一个hello word吧;
在pom中添加jsoup依赖,如下图:
Code 如下:
同样这个框架提供了很多的api,如下可以获取html对应某个标签的值;
Elements elements = document.getElementsByTag("p");
for(Element element : elements){
String text = element.ownText();
System.out.println(text);
}
更多的api可以去官方网站上查询,https://jsoup.org/apidocs/;
实战
从网页上获取自己想要的内容,首先获取目标,我这边以简书上的一份博客为例:
按F12,找的你感兴趣的部分,需要一点HTML便签的基础,然后对应JSOUP的api开始编程;
代码如下:
public class ReptileNetWork {
// private static final String URL = "https://hzxkctk.cn/Guide/2019920/1568962042448_1.html";
private static final String URL = "https://www.jianshu.com/p/01a4ed127a52";
public static void main(String[] args) {
try {
trustEveryone();
// 方式一:直接调用connect
Document documented = Jsoup.connect(URL).get();
// 方式二:直接调用connect
// Document documented = Jsoup.connect(URL)
// .data("query", "Java")
// .userAgent("Mozilla")
// .cookie("auth", "token")
// .timeout(3000)
// .post();
String title = documented.title();
System.out.println("头"+title);
Elements elements = documented.getElementsByClass("_2rhmJa");
for(Element element : elements){
Elements pe = element.getElementsByTag("p");
pe.stream().forEach(x->{
System.out.println(x.text());
});
}
String body = documented.body().ownText();
System.out.println(body);
}
catch (IOException e) {
e.printStackTrace();
}
}
我这边是直接获取css的class为_2rhmJa下p标签中的内容;运行之后的效果:
问题
如果碰到https协议的url,需要加上ssl认证,在连接获取之前,调用下放代码:
/**
*信任任何站点,实现https页面的正常访问
*
*/
public static void trustEveryone() {
try {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean
verify(String hostname, SSLSession session) {
return true;
}
});
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new X509TrustManager[] { new X509TrustManager() {
@Override
public void
checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void
checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public
X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
} },
new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
}
catch (Exception e) {
// e.printStackTrace();
}
}