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


1、Jsoup简介

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

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

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

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

  1. package com.Utill;
  2.  
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.ckms.comp.manager.im.govManage.service.GovManageServiceImpl;
  5. import org.jsoup.Jsoup;
  6. import org.jsoup.nodes.Document;
  7. import org.jsoup.nodes.Element;
  8. import org.jsoup.select.Elements;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11.  
  12. import java.io.*;
  13. import java.util.*;
  14.  
  15. /**
  16. * @Author:
  17. * @Date: 2019/10/1 13:43
  18. * @Describe:
  19. */
  20. public class JsoupDemo {
  21.  
  22. private static final Logger logger = LoggerFactory.getLogger(JsoupDemo.class);
  23.  
  24. private String keyword = null;
  25. private String endtime = null;
  26. private String begintime = null;
  27. private String zzUrl = null;
  28. private boolean start = false;
  29. int isSize = 1;
  30. Integer pageSize = 0;
  31. Integer timeType = 6; // 时间类型 6: 指定时间 5:近半年 0:今日 4:近3月
  32.  
  33. /**
  34. * 爬虫调用主方法
  35. *
  36. * @param id 关键词的饿id
  37. * @param kw 关键词
  38. * @param startTime 开始时间
  39. * @param endTime 结束时间
  40. */
  41. public void fetch(Integer id, String kw, String startTime, String endTime) {
  42. logger.info("开始拉取网站数据》》》》》》》》》》》》》》》》》》》》》》》》》》》");
  43. Integer totalSize = null;
  44. try {
  45. keyword = toUtf8String(kw);
  46. begintime = startTime.replace("/", "%3A");
  47. endtime = endTime.replaceAll("/", "%3A");
  48. pageSize = 1;
  49. 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=";
  50. start = true;
  51. //获取总页数
  52. totalSize = fetchHomePageUrl(zzUrl);
  53. if (totalSize != null && totalSize > 0) {
  54. while (start) {
  55.  
  56. if (isSize > totalSize) {
  57. start = false;
  58. } else {
  59. pageSize = isSize;
  60. 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=";
  61. //开始遍历每一页数据
  62. fetchingPageUrl(id, isSize, zzUrl);
  63. isSize++;
  64. }
  65. }
  66. } else {
  67. logger.info("关键词:" + kw + "没有查询到相关数据-" + new Date());
  68. isSize = 1;
  69. }
  70. } catch (Exception er) {
  71. logger.error("========================获取数据失败,重新获取中.....=================================");
  72. }
  73. }
  74.  
  75. //URL汉字转码
  76. public static String toUtf8String(String s) {
  77. StringBuffer sb = new StringBuffer();
  78. for (int i = 0; i < s.length(); i++) {
  79. char c = s.charAt(i);
  80. if (c >= 0 && c <= 255) {
  81. sb.append(c);
  82. } else {
  83. byte[] b;
  84. try {
  85. b = String.valueOf(c).getBytes("utf-8");
  86. } catch (Exception ex) {
  87. System.out.println(ex);
  88. b = new byte[0];
  89. }
  90. for (int j = 0; j < b.length; j++) {
  91. int k = b[j];
  92. if (k < 0)
  93. k += 256;
  94. sb.append("%" + Integer.toHexString(k).toUpperCase());
  95. }
  96. }
  97. }
  98. return sb.toString();
  99. }
  100.  
  101. // 首次访问url ,需查找当前查询词所在的总页数
  102. public Integer fetchHomePageUrl(String ur) {
  103. Integer size = null;
  104. try {
  105. //maxBodySize : 0 不限制大小, 1: 1m userAgent: 伪装成浏览器
  106. Document doc = Jsoup.connect(ur).header("Accept-Encoding", "gzip, deflate")
  107. .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
  108. .maxBodySize(0).timeout(600000).get();
  109. Elements eli = doc.select(".vT-srch-result-list-con2 .vT-srch-result-list .vt-srch-result-list-bid>li");
  110. if (eli.size() > 0) {
  111. //获取分页html
  112. Elements allElements = doc.select(".vT_z .pager>script");
  113. if (allElements.size() > 0) {
  114. String pager = allElements.get(0).childNodes().toString();
  115. String startStr = pager.substring(7, pager.length());
  116. String objectStr = startStr.substring(0, startStr.lastIndexOf(")"));
  117. //string转json对象
  118. JSONObject jsonObject = JSONObject.parseObject(objectStr);
  119. // 共有多少页
  120. size = Integer.valueOf((Integer) jsonObject.get("size"));
  121. }
  122. }
  123. } catch (IOException e1) {
  124. e1.printStackTrace();
  125. }
  126. return size;
  127. }
  128.  
  129. // 遍历页数
  130. public void fetchingPageUrl(Integer id, Integer pageSize, String fetchUrl) {
  131. Integer is_homePage = 1; // 0 : 首页 1: 否
  132.  
  133. String noticeOutline = null;
  134. try {
  135. Document pDoc = Jsoup.connect(fetchUrl).header("Accept-Encoding", "gzip, deflate")
  136. .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
  137. .maxBodySize(0)
  138. .timeout(600000).get();
  139. //根据css样式 获取当前页的所有url
  140. Elements elements = pDoc.select(".vT_z .vT-srch-result-list-bid>li");
  141. // Elements hrefs = doc.select("a[href]");
  142. //遍历当前页的所有url
  143. for (Element element : elements) {
  144. //根据Jsoup解析,解析每一页的详细数据,见下一篇博客
  145.  
  146. }
  147. } catch (Exception e) {
  148. e.printStackTrace();
  149. }
  150. }
  151. }

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

  1. java爬虫中jsoup的使用

    jsoup可以用来解析HTML的内容,其功能非常强大,它可以向javascript那样直接从网页中提取有用的信息 例如1: 从html字符串中解析数据 //直接从字符串中获取 public stati ...

  2. java爬虫框架jsoup

    1.java爬虫框架的api jsoup:https://www.open-open.com/jsoup/

  3. Java爬虫框架Jsoup学习记录

    Jsoup的作用 当你想获得某网页的内容,可以使用此框架做个爬虫程序,爬某图片网站的图片(先获得图片地址,之后再借助其他工具下载图片)或者是小说网站的小说内容 我使用Jsoup写出的一款小说下载器,小 ...

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

    Jsoup简介 Java爬虫解析HTML文档的工具有:htmlparser, Jsoup.本文将会详细介绍Jsoup的使用方法,10分钟搞定Java爬虫HTML解析. Jsoup可以直接解析某个URL ...

  5. Java爬虫系列三:使用Jsoup解析HTML

    在上一篇随笔<Java爬虫系列二:使用HttpClient抓取页面HTML>中介绍了怎么使用HttpClient进行爬虫的第一步--抓取页面html,今天接着来看下爬虫的第二步--解析抓取 ...

  6. Java阶段性测试--第四五六大题参考代码

    第四题:.此题要求用IO流完成 使用File类在D盘下创建目录myFiles, 并在myFiles目录下创建三个文件分别为:info1.txt, info2.txt, info3.txt . 代码: ...

  7. 初识Java程序,编写简单代码?

    Dear All: 初识Java程序,编写简单代码? 首先小编在这里说下我们今天编写Java程序使用的是 eclipse 开发工具! 1.下载eclipse 官网地址:http://www.eclip ...

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

    自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...

  9. JAVA爬虫挖取CSDN博客文章

    开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...

随机推荐

  1. Selenium实战(三)——滑动解锁+窗口截图

    一.简单滑块的实例 当单机滑块时,改变的只是CSS样式,HTML代码如下: <div class="slide-to-unlock-progress" style=" ...

  2. IntelliJ IDEA提示URI is not registered几种解决方法

    IntelliJ IDEA提示URI is not registered几种解决方法使用IntelliJ IDEA (以下简称IDEA)导入项目或是在maven生成  archetype时候,如果提示 ...

  3. 【终端使用】常用Linux命令的基本使用

    常用Linux命令的基本使用: 命令 对应英文 作用 ls list 查看当前文件夹下的内容 pwd print work directory 查看当前所在的文件夹 cd [目录名] change d ...

  4. Codeforces 1304E. 1-Trees and Queries 代码(LCA 树上两点距离判奇偶)

    https://codeforces.com/contest/1304/problem/E #include<bits/stdc++.h> using namespace std; typ ...

  5. Excel数据源增加时,渗透表如何刷新?

    使用Excel制作渗透表的时候在选择数据源范围的时候不要选择有限区域!!!最好圈定列范围 问题:制作渗透表是,在选择数据区域时使用[Ctrl + A]或者选定有限的数据区域,从而导致当数据源增加时,渗 ...

  6. MySQL的DQL语言(查)

    MySQL的DQL语言(查) DQL:Data Query Language,数据查询语言. DQL是数据库中最核心的语言,简单查询,复杂查询,都可以做,用select语句. 1. 查询指定表的全部字 ...

  7. 莫凡_linux

    1.安装软件 2.基本命令ls和cd cd 指令 第一个要知道的指令就是怎么样去到你想去的地方. cd (Change Directory) 就是干这个的. 找到 Linux 的 terminal 窗 ...

  8. UVa - 12050 Palindrome Numbers (二分)

    Solve the equation: p ∗ e −x + q ∗ sin(x) + r ∗ cos(x) + s ∗ tan(x) + t ∗ x 2 + u = 0 where 0 ≤ x ≤ ...

  9. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(4.12-加-6.2-加-7.2.5.2)Fused_Operations

    4.12 Fused Operations 融合操作 融合操作通过“fusing”把两个简单的命令融合一起来支持一个更复杂的命令.协议规定这个特性是可选的:如果支持此特性,需要在Figure 247 ...

  10. Android Q 使用通知栏消息

    String myChannelId = "iot"; String myChannelName = "告警通知服务"; NotificationManager ...