初识Java爬虫之Jsoup,提供参考代码

本文主要分享的是关于Java爬虫技术其中一个方式   ==>  Jsoup


1、Jsoup简介

  推开技术大门,爬虫技术琳琅满目,而今天要分享的Jsoup是一款Java的HTML解析神器,,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API。可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

。关于Jsoup的详细介绍,不赘述,以下是 官方文档,自行查阅。我们直接上代码。

2、代码分享(真实爬取一个政府采购网:中国政府采购网,按照关键词搜索的公告)

注意的点:爬虫的是要爬取大量列表信息的,这就要考虑到判断总页数,翻开每一页,遍历每一条数据,还要在F12模式下,查看网页发起请求的格式,查看URL传递参数的加密方式,如果请求失败了,如何处理  等等

package com.Utill;

import com.alibaba.fastjson.JSONObject;
import com.ckms.comp.manager.im.govManage.service.GovManageServiceImpl;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.*;

/**
 * @Author:
 * @Date: 2019/10/1 13:43
 * @Describe:
 */
public class JsoupDemo {

    private static final Logger logger = LoggerFactory.getLogger(JsoupDemo.class);

    private String keyword = null;
    private String endtime = null;
    private String begintime = null;
    private String zzUrl = null;
    private boolean start = false;
    int isSize = 1;
    Integer pageSize = 0;
    Integer timeType = 6;  // 时间类型   6: 指定时间  5:近半年  0:今日  4:近3月

    /**
     * 爬虫调用主方法
     *
     * @param id        关键词的饿id
     * @param kw        关键词
     * @param startTime 开始时间
     * @param endTime   结束时间
     */
    public void fetch(Integer id, String kw, String startTime, String endTime) {
        logger.info("开始拉取网站数据》》》》》》》》》》》》》》》》》》》》》》》》》》》");
        Integer totalSize = null;
        try {
            keyword = toUtf8String(kw);
            begintime = startTime.replace("/", "%3A");
            endtime = endTime.replaceAll("/", "%3A");
            pageSize = 1;
            zzUrl = "http://search.ccgp.gov.cn/bxsearch?searchtype=1&page_index=" + pageSize + "&bidSort=0&buyerName=&projectId=&pinMu=0&bidType=0&dbselect=bidx&kw=" + keyword + "&start_time=" + begintime + "&end_time=" + endtime + "&timeType=" + timeType + "&displayZone=&zoneId=&pppStatus=0&agentName=";
            start = true;
            //获取总页数
            totalSize = fetchHomePageUrl(zzUrl);
            if (totalSize != null && totalSize > 0) {
                while (start) {

                    if (isSize > totalSize) {
                        start = false;
                    } else {
                        pageSize = isSize;
                        zzUrl = "http://search.ccgp.gov.cn/bxsearch?searchtype=1&page_index=" + isSize + "&bidSort=0&buyerName=&projectId=&pinMu=0&bidType=0&dbselect=bidx&kw=" + keyword + "&start_time=" + begintime + "&end_time=" + endtime + "&timeType=" + timeType + "&displayZone=&zoneId=&pppStatus=0&agentName=";
                        //开始遍历每一页数据
                        fetchingPageUrl(id, isSize, zzUrl);
                        isSize++;
                    }
                }
            } else {
                logger.info("关键词:" + kw + "没有查询到相关数据-" + new Date());
                isSize = 1;
            }
        } catch (Exception er) {
            logger.error("========================获取数据失败,重新获取中.....=================================");
        }
    }

    //URL汉字转码
    public static String toUtf8String(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 0 && c <= 255) {
                sb.append(c);
            } else {
                byte[] b;
                try {
                    b = String.valueOf(c).getBytes("utf-8");
                } catch (Exception ex) {
                    System.out.println(ex);
                    b = new byte[0];
                }
                for (int j = 0; j < b.length; j++) {
                    int k = b[j];
                    if (k < 0)
                        k += 256;
                    sb.append("%" + Integer.toHexString(k).toUpperCase());
                }
            }
        }
        return sb.toString();
    }

    // 首次访问url ,需查找当前查询词所在的总页数
    public Integer fetchHomePageUrl(String ur) {
        Integer size = null;
        try {
            //maxBodySize : 0  不限制大小, 1: 1m    userAgent: 伪装成浏览器
            Document doc = Jsoup.connect(ur).header("Accept-Encoding", "gzip, deflate")
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
                    .maxBodySize(0).timeout(600000).get();
            Elements eli = doc.select(".vT-srch-result-list-con2 .vT-srch-result-list .vt-srch-result-list-bid>li");
            if (eli.size() > 0) {
                //获取分页html
                Elements allElements = doc.select(".vT_z .pager>script");
                if (allElements.size() > 0) {
                    String pager = allElements.get(0).childNodes().toString();
                    String startStr = pager.substring(7, pager.length());
                    String objectStr = startStr.substring(0, startStr.lastIndexOf(")"));
                    //string转json对象
                    JSONObject jsonObject = JSONObject.parseObject(objectStr);
                    //  共有多少页
                    size = Integer.valueOf((Integer) jsonObject.get("size"));
                }
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return size;
    }

    // 遍历页数
    public void fetchingPageUrl(Integer id, Integer pageSize, String fetchUrl) {
        Integer is_homePage = 1;  // 0 : 首页  1: 否

        String noticeOutline = null;
        try {
            Document pDoc = Jsoup.connect(fetchUrl).header("Accept-Encoding", "gzip, deflate")
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
                    .maxBodySize(0)
                    .timeout(600000).get();
            //根据css样式 获取当前页的所有url
            Elements elements = pDoc.select(".vT_z .vT-srch-result-list-bid>li");
            // Elements hrefs = doc.select("a[href]");
            //遍历当前页的所有url
            for (Element element : elements) {
                //根据Jsoup解析,解析每一页的详细数据,见下一篇博客

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/dk1024/p/11615299.html

时间: 2024-11-02 13:08:39

初识Java爬虫之Jsoup,提供参考代码的相关文章

Java 爬虫工具Jsoup解析

Jsoup是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据. jsoup 的主要功能如下: 1. 从一个 URL,文件或字符串中解析 HTML: 2. 使用 DOM 或 CSS 选择器来查找.取出数据: 3. 可操作 HTML 元素.属性.文本: jsoup 是基于 MIT 协议发布的,可放心使用于商业项目. jsoup 可以从包括字符串.URL

Java第三次作业参考代码

控制杆类 public class Lever { protected int lever = 1; public Lever() { lever = 1; } public Lever(int lever) { this.lever = lever; } public int getLever() { return lever; } public int leverUp() { if(lever < 4) lever++; return lever; } public int leverDow

Java爬虫利器HTML解析工具-Jsoup

Jsoup简介 Java爬虫解析HTML文档的工具有:htmlparser, Jsoup.本文将会详细介绍Jsoup的使用方法,10分钟搞定Java爬虫HTML解析. Jsoup可以直接解析某个URL地址.HTML文本内容,它提供非常丰富的处理Dom树的API.如果你使用过JQuery,那你一定会非常熟悉. Jsoup最强大的莫过于它的CSS选择器支持了.比如:document.select("div.content > div#image > ul > li:eq(2). 包

福利贴——爬取美女图片的Java爬虫小程序代码

自己做的一个Java爬虫小程序 废话不多说,先上图. 文件夹命名是用标签缩写,如果大家看得不顺眼可以等下载完成后手动改一下,比如像有强迫症的我一样... 这是挂了一个晚上下载的总大小,不过还有很多因为一些问题没有遍历下载到,而且会产生很多空文件,最下面我附带了一个递归删除空文件夹的小程序代码. 接下来是文件夹内部~ 图片存放位置默认为d:\picture,可在程序中更改,main函数的开头就是,有注释.爬取的网站为http://www.mmonly.cc/,大家有更好的资源网站可以私我. 爬虫源

native关键字初识--java调用非java代码的接口

Java基础知识--JNI入门介绍(上) Java? 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成.如果您希望利用已有的代码资源,那么可以使用 JNI 作为您工具包中的关键组件 -- 比如在面向服务架构(SOA)和基于云的系统中.但是,如果在使用时未注意某些事项,则 JNI 会迅速导致应用程序性能低下且不稳定. JNI 的发展JNI 自从 JDK 1.1 发行版以来一直是 Java 平台的

爬虫入门 手写一个Java爬虫

本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做什么的?  他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径, 然后继续访问,继续解析;继续查找需要的数据和继续解析出新的URL路径  . 这就是网络爬虫主要干的工作.  下面是流程图: 通过上面的流程图

Java 爬虫学习

Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能有: 从给定的URL.文件.字符串中,获得HTML代码. 然后通过DOM.CSS选择器(类jQuery方式)来查找.取出数据:先找到HTML元素,然后获取其属性.文本等. API初步学习: 上面提到了三种方式,获取HTML文档(JSoup的Document对象的结构是:<html><head

JAVA爬虫 WebCollector

爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫内核: WebCollector致力于维护一个稳定.可扩的爬虫内核,便于开发者进行灵活的二次开发.内核具有很强的扩展性,用户可以在内核基础上开发自己想要的爬虫.源码中集成了Jsoup,可进行精准的网页解析. 量级: WebCollector最常用的爬取器BreadthCrawler使用2^24的布隆过滤器进行URL管理,可处理2^24量级

webmagic的设计机制及原理-如何开发一个Java爬虫 转

此文章是webmagic 0.1.0版的设计手册,后续版本的入门及用户手册请看这里:https://github.com/code4craft/webmagic/blob/master/user-manual.md 之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方面倒是有一些心得,希望对读者有帮助. webmagic的目标 一般来说,一个爬虫包括