初识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();
}
}
}
初识Java爬虫之Jsoup,提供参考代码的更多相关文章
- java爬虫中jsoup的使用
jsoup可以用来解析HTML的内容,其功能非常强大,它可以向javascript那样直接从网页中提取有用的信息 例如1: 从html字符串中解析数据 //直接从字符串中获取 public stati ...
- java爬虫框架jsoup
1.java爬虫框架的api jsoup:https://www.open-open.com/jsoup/
- Java爬虫框架Jsoup学习记录
Jsoup的作用 当你想获得某网页的内容,可以使用此框架做个爬虫程序,爬某图片网站的图片(先获得图片地址,之后再借助其他工具下载图片)或者是小说网站的小说内容 我使用Jsoup写出的一款小说下载器,小 ...
- Java爬虫利器HTML解析工具-Jsoup
Jsoup简介 Java爬虫解析HTML文档的工具有:htmlparser, Jsoup.本文将会详细介绍Jsoup的使用方法,10分钟搞定Java爬虫HTML解析. Jsoup可以直接解析某个URL ...
- Java爬虫系列三:使用Jsoup解析HTML
在上一篇随笔<Java爬虫系列二:使用HttpClient抓取页面HTML>中介绍了怎么使用HttpClient进行爬虫的第一步--抓取页面html,今天接着来看下爬虫的第二步--解析抓取 ...
- Java阶段性测试--第四五六大题参考代码
第四题:.此题要求用IO流完成 使用File类在D盘下创建目录myFiles, 并在myFiles目录下创建三个文件分别为:info1.txt, info2.txt, info3.txt . 代码: ...
- 初识Java程序,编写简单代码?
Dear All: 初识Java程序,编写简单代码? 首先小编在这里说下我们今天编写Java程序使用的是 eclipse 开发工具! 1.下载eclipse 官网地址:http://www.eclip ...
- 福利贴——爬取美女图片的Java爬虫小程序代码
自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...
- JAVA爬虫挖取CSDN博客文章
开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...
随机推荐
- 单向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...
- .net mvc接收对象数组 通过ajax提交
ajax代码 var obj = {}; obj.RoomName = ""; obj.RoomCode = ""; $.ajax({ type: " ...
- Docker学习参考网站
Docker——从入门到实践 https://www.yuque.com/grasilife/docker 2.阿里源网站:https://cr.console.aliyun.com 3.DaoClo ...
- PAT (Advanced Level) Practice 1015 Reversible Primes (20 分)
A reversible prime in any number system is a prime whose "reverse" in that number system i ...
- OI学习之路上的宝藏网站/App分享
OI学习之路上的宝藏网站/App分享 想要变强吗少年?这里有各种我平时收集的网站/App,它们可以帮助你更好地学习算法或者找到解题思路.废话不多说,快来打开新世界的大门罢~ 知识学习 觉得各种知识晦涩 ...
- 《Python学习手册 第五版》 -第14章 迭代和推导
承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...
- redis测试题
1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存. ...
- ACM-ICPC 2018 焦作赛区网络预赛 Give Candies 题解
ACM-ICPC 2018 焦作赛区网络预赛 Give Candies n个糖果分给n个小朋友 从1到n个小朋友依次给,每次随机给个数,至少一个,知道没有糖果为止. 问糖果的分布情况方案数. 输出方案 ...
- 使用nohup不产生log文件方法
思想 无法阻止nohup产生日志可以将其定向到空文件实现 实现 $ nohup xxx >/dev/null 2>&1 &
- 遇到的基础php函数、方法
0x01 PHP file() 函数 file() 函数把整个文件读入一个数组中. 数组中的每个元素都是文件中相应的一行,包括换行符在内. 实例: <?php print_r(file(&quo ...