使用Jsoup框架基于Java语言进行爬虫

背景

市面上的爬虫框架有很多,大都是基于Python的,不得不说Python在处理数据方面很出色,尤其是在把数据做成可视化的图表方面。但是作为Java程序员,对Java情有独钟,我觉得关于Java的爬虫框架也要或多或少的了解,而且平常在工作中有时候需要从网上爬一点数据拿过来用,这个时候来回切换语言也是很不适的,我直接在当前的开发环境扒点数据入库,多好……

简单介绍

Jsoup是一个Java爬虫框架,具体它是什么此处不介绍,只简单说一下爬虫的大概流程。

其实爬虫就是伪装成浏览器向目标服务器发起请求,然后处理返回的数据这样的一个过程,在Jsoup中,大概流程如下:

  1. 指定一个URL,请求一个DOM
  2. 定义我们的规则,或者说是正则表达式
  3. 解析DOM文档

大的步骤就是这样,就是访问服务器,得到一个超文本字符串,然后从这个字符串中抠下来我们需要的内容。

代码

话不多说,直接上码,结合注释理解。

package com.cloud.study.demo.Controller;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class JsoupUtil {
    public static void main(String[] args) throws IOException {
        //爬取凤凰网今日要闻
        Connection connection = Jsoup.connect("http://www.ifeng.com/");

        //设置一些请求头信息,某些场景下可躲避反爬。其他信息此处省略,费劲……
        connection.header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0");

        //得到一篇HTML文档,即DOM树
        Document document=connection.get();  //模拟GET请求访问

        //定义我们想要扒取的内容规则,跟CSS选择器差不多
        String select="div[id=headLineDefault]>ul[class=FNewMTopLis]>ul>li";

        //拿到结果,通过Document对象的select(String query)方法,传入我们定义的选择器
        Elements results=document.select(select);

        //打印标签之间的内容
        for (Element element:results){
            System.out.println(element.text());
        }
    }
}

运行结果:

 简述

上述代码,爬取了凤凰网首页的这一部分内容:

其实太简单了,主要就是对这个HTML文档进行解析挖取,而我们的Jsoup实际上就是一个HTML解析器。最核心的地方在于怎样拼写选择器,主要就是对这个页面结构进行分析:

通过它的页面结构可以看出来,我们需要的信息字符串在哪一个层级下,所以就可以根据自己的需要指定选择器了。其实这个选择器还挺好理解的,跟CSS里的选择器差不多。

到这里,我们的数据爬取就完成了,再往下怎么利用这个数据就是自己的事了。

比如你的APP或者网站要内置一个板块,专门用来展示热点新闻,但是你们公司自己又不愿在这方面花费太多成本,这时候就可以通过爬虫的方式从第三方获取数据,你可以爬下来之后直接入库,顺便往缓存中放一份,这样在用户查询的时候提升效率。

PS:Jsoup在处理一个Element的时候,如果调用text()方法发现内容是超链接,它是可以继续向下访问这个超链接的目标地址的,所以你就可以更深一层次的进行爬取,这个功能可以用在爬取新闻的场景,因为我们爬取新闻网站一般只能先爬取下来标题,然后访问它所带的超链接(又是另外一个URL了),才是它的具体内容。

好了,年底了,祝大家一切都好,不要被裁,被裁的都顺利找到下一家~~~(虽然我还没找到下家)

经验分享 程序员 微信小程序 职场和发展