Java Jsoup爬虫入门

一、了解Jsoup

Jsoup是一款Java的HTML解析器,主要用来对HTML解析。

二、JSoup的Mavven依赖

<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.14.1</version>
</dependency>

三、Jsoup框架中的常用方法

connet (String url): 创建一个新的Connection连接对象。

get(): 取得要解析的一个HTML文件,如果从该URL获取HTML时发生错误,则会抛出IOException异常。

parse(String html,String vaseUri): 将输入的HTML解析为一个新的文档(Document),参数baseUri用来相对一个URL转成绝对URL.并指定从哪个网站获取文档.只要解析的不是空字符串,就能返回一个结构合理的文档,其中包含(至少)一个head和一个body的元素。

parseBodyFragment(): 创建一个空壳的文档,并插入解析过得HTML到Body元素中,如果使用正常的Jsoup.parse(String html)方法,通常也可以得到相同的结果。

Document.body(): 能够取得文档body元素的所有子元素,具体功能与doc.getElementsByTag("body")相同。

Node.atter(String key): 获取一个属性的值。

Element.text(): 获取一个元素中的文本。

Element.html()或Node.outerHtml(): 获取元素或属性中的HTML内容。

四、JSoup 解析 HTML 字符串

说明:通过调用fetchHtmlSync("需要爬取的网址")得到HTML字符串str,再调用Jsoup.parse(str)将输入的HTML解析为一个新的文档(Document)。

/**
     * okhttp客户端
     * OkHttpClient是一个高效的HTTP客户端,其特性包含:
     * 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接池减少请求延时
     * 透明的GZIP压缩减少响应数据的大小
     * 缓存响应内容,避免一些完全重复的请求*/

    private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient
            .Builder()
            //设置连接超时时间为30秒
            .connectTimeout(30, TimeUnit.SECONDS)
            //自定义线程池任务调度策略 dispatcher(线程调度策略)
            .dispatcher(new Dispatcher(new ThreadPoolExecutor(1, 1, 2, TimeUnit.MINUTES, new LinkedBlockingQueue<>(6000), r -> new Thread("spider task"))))
            //设置代理 没有使用代理ip进行抓取
            .connectionPool(new ConnectionPool(2, 1, TimeUnit.MINUTES))
            .build();

    /**
     * 同步获取网页数据
     *
     * @param url 网站地址
     * @return 网页内容
     * @throws IOException
     */

    public static String fetchHtmlSync(String url) throws IOException {
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Request request = new Request.Builder().url(url)
                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
                .addHeader("Referer", "http://……")
                .build();
        return Objects.requireNonNull(OK_HTTP_CLIENT.newCall(request).execute().body()).string();
        //Request request = new Request.Builder().url(要获取的网页).build();
        //String s =OK_HTTP_CLIENT.newCall(request).execute().body().string();//s即为网页源码的字符串
        //Objects.requireNonNull() 用于在方法中进行参数验证。遇到要判断对象是否为空,空的时候报空指针异常
    }

五、Jsoup获取信息

使用标准的DOM方法:

根据id查找元素: getElementById(String id)
根据标签查找元素: getElementsByTag(String tag)
根据class查找元素: getElementsByClass(String className)
根据属性查找元素: getElementsByAttribute(String key)
兄弟遍历方法: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
层级之间遍历: parent(), children(), child(int index)

这些方法会返回Element或者Elements节点对象,这些对象可以使用下面的方法获取一些属性:

attr(String key): 获取某个属性值
attributes(): 获取节点的所有属性
id(): 获取节点的id
className(): 获取当前节点的class名称
classNames(): 获取当前节点的所有class名称
text(): 获取当前节点的textNode内容
html(): 获取当前节点的 inner HTML
outerHtml(): 获取当前节点的 outer HTML
data(): 获取当前节点的内容,用于script或者style标签等
tag(): 获取标签
tagName(): 获取当前节点的标签名称

例子: 获取id="docContent"标签下所有a标签中href = ""的内容

Document document=Jsoup.parse("爬取网站");
Elements elements=document.getElementById("docContent").select("a");
for (Element element : elements) {
            String myUrl=element.attr("href");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值