基于Jsoup的网络爬虫的使用以及网页分析的基本方法
至于网络爬虫是什么我在此就不再多做介绍,本篇博客主要讲解
- Jsoup的实现原理以及使用
- 如何通过对网页分析实现爬虫
- 通过一个实例具体演示以上介绍的方法
Jsoup是什么?
官方对它的解释是:一个HTML解析器。
它可以从URL、文件、字符串中提取并解析HTML,通过DOM遍历或CSS选择器查找并提取数据,也可以修改HTML各个元素的各种属性。
本篇文章只介绍它的基本使用,想要对它进行更深层次的了解,可以参考jsoup开发指南,jsoup中文使用手册,jsoup中文文档。
Jsoup的几个重要方法:
- attr(String attributeKey):获取当前标签attributeKey属性中的内容
- attr(String attributeKey,String attributeValue):将当前标签的attributeKey属性内容替换成attributeValue。
- child(int index):获取当前标签的第index个子标签
- children():获取当前标签的全部子标签
- getAllElements():获取当前Dom树的全部标签
我们通过抓取****博客的页面内容,实际演示一下Jsoup的使用
我们首先建立一个基于Gradle或者Maven的Java项目(当然不用它们直接导jar包也可以),我这里是用的Gradle。
1、选择用Gradle建立项目
这里随便填
剩下两步默认就好。
然后我们导入Jsoup的依赖
Gradle:
compile group: 'org.jsoup', name: 'jsoup', version: '1.11.3'
Maven :
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
此工具类可以获取网页的全部标签元素
public class JsoupUtil {
/**
* 获取网页的全部标签元素
* @param url 网页的Url
* @return 网页的全部标签元素
*/
public static Elements doConnect(String url){
Connection.Response rs=null;
try {
rs = Jsoup.connect(url).execute();
} catch (IOException e) {
e.printStackTrace();
System.out.println("连接超时");
}
return Jsoup.parse(rs.body()).getAllElements();
}
}
我们用浏览器打开网页https://blog.****.net/qq_36598186,右键博文链接,选择"查看元素",打开网页查看器。
分析网页得知,
1、所有含有博文链接的标签class为"article-item-box ****-tracking-statistics"
2、它的子标签(<h4>)的子标签<a>中属性("href")为指向博文的链接,文章名为其文字内容。
那么写出代码(注意导包时Element的包不要导错,它所在的包为org.jsoup.nodes.Element)
public class Main {
List<Blog> blogs=new ArrayList<>(); //储存获取到的url及其文章名称
public void getBlog(){
Elements elements=JsoupUtil.doConnect("https://blog.****.net/qq_36598186");
for (Element element:elements){
if (element.attr("class").equals("article-item-box ****-tracking-statistics")){ //获取class属性为article...的标签
System.out.println(element.child(0).child(0).attr("href")); //输出当前标签子标签的子标签的href属性值
System.out.println(element.child(0).child(0).text()); //输出当前标签子标签的子标签的文字内容
Blog blog=new Blog(element.child(0).child(0).text(),element.child(0).child(0).attr("href"));
blogs.add(blog);
}
}
}
class Blog{
String name; //文章名
String url; //文章url
public Blog(String name, String url) {
this.name = name;
this.url = url;
}
}
public static void main(String args[]){
new Main().getBlog();
}
}
我们如果想获取每一个文章的内容,该怎么办呢?
我们继续分析博文内容的网页https://blog.****.net/qq_36598186/article/details/82862887
右键文章内容查看元素。
分析得知所有的内容都在class属性为htmledit_views的标签内
因为已经成功获取到了我们所需的url,那么我们只需在原来代码上稍作修改:
public class Main {
List<Blog> blogs=new ArrayList<>();
public void getBlog(){
Elements elements=JsoupUtil.doConnect("https://blog.****.net/qq_36598186");
for (Element element:elements){
if (element.attr("class").equals("article-item-box ****-tracking-statistics")){
System.out.println(element.child(0).child(0).attr("href"));
System.out.println(element.child(0).child(0).text());
Blog blog=new Blog(element.child(0).child(0).text(),element.child(0).child(0).attr("href"));
blogs.add(blog);
}
}
blogs.remove(0); //这里是因为发现一段被原网页注释掉的代码被解析成为了指向内容的url
for (Blog blog : blogs) {
Elements elements1=JsoupUtil.doConnect(blog.url);
for (Element element:elements1){
if (element.attr("class").equals("htmledit_views")){
System.out.println(element.text()); //获取所有class属性为htmledit_views的文本
}
}
}
}
class Blog{
String name;
String url;
public Blog(String name, String url) {
this.name = name;
this.url = url;
}
}
public static void main(String args[]){
new Main().getBlog();
}
}
大功告成!