java jsoup 网络爬虫 学习例子(五)宽度优先

java jsoup 网络爬虫 学习例子(五) 宽度优先

 

package com.iteye.injavawetrust.gethtml;

import java.util.Map;
import java.util.Set;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class GetHtml {
	
	private static JsoupUtil ju = JsoupUtil.getInstance();
	
	public void getHtml(String url){
		ju.initUnvisitedUrl(url);
		//待访问队列不为空,已访问<10000
		while(!HtmlQueue.unVisitedUrlsEmpty() && HtmlQueue.getVisitedUrlNum() < 10000){
			String visitUrl = (String) HtmlQueue.unVisitedUrlDeQueue();
			if(null == visitUrl){
				continue;
			}
			Map<String, String> map = ju.getHtml(visitUrl);
			if(0 == map.size()){
				continue;
			}
			ju.getHtmlToLocal(map); //将html写如本地文件
			HtmlQueue.addVisitedUrl(visitUrl); //将该URL放入到已访问的URL队列中
			Set<String> links = ju.getAllUrl(visitUrl); //提取出下载网页中的URL
			for(String link :links){
				if(!link.startsWith(Constants.URL)){
					continue;
				}
				if(!ju.checkURL(link)){
					continue;
				}
				// 新的未访问的 URL加入队待访问的 URL队列
				HtmlQueue.addUnvisitedUrl(link);
			}
			
		}
	}
	
	public static void main(String[] args) {
		GetHtml gh = new GetHtml();
		long starTime = System.currentTimeMillis();
		gh.getHtml(Constants.URL);
		long endTime = System.currentTimeMillis();
		System.out.println("共下载 [" + HtmlQueue.getVisitedUrlNum() + "]");
		System.out.println("用时 [" + ju.msToss(endTime - starTime) + "]");
	}

}


package com.iteye.injavawetrust.gethtml;

import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Set;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class HtmlQueue {

	/**
	 * 已访问的URL队列
	 */
	private static Set<String> visitedUrl = new HashSet<String>();
	/**
	 * 待访问的 URL队列
	 */
	private static Queue<String> unVisitedUrl = new PriorityQueue<String>();
	/**
	 * 获得待访问URL队列
	 * @return
	 */
	public static Queue<String> getUnVisitedUrl() {
		return unVisitedUrl;
	}
	/**
	 * 添加到访问过的URL队列中
	 * @param url
	 */
	public static void addVisitedUrl(String url) {
		visitedUrl.add(url);
	}
	/**
	 * 移除访问过的URL
	 * @param url
	 */
	public static void removeVisitedUrl(String url) {
		visitedUrl.remove(url);
	}
	/**
	 * 未访问的URL出队列
	 * @return
	 */
	public static Object unVisitedUrlDeQueue() {
		return unVisitedUrl.poll();
	}
	/**
	 * 添加到待访问的 URL队列,保证每个URL只被访问一次
	 * @param url
	 */
	public static void addUnvisitedUrl(String url) {
		if (url != null && !url.trim().equals("") && !visitedUrl.contains(url)
				&& !unVisitedUrl.contains(url))
			unVisitedUrl.add(url);
	}
	/**
	 * 获得已经访问的URL数目
	 * @return
	 */
	public static int getVisitedUrlNum() {
		return visitedUrl.size();
	}
	/**
	 * 判断未访问的URL队列中是否为空
	 * @return true-空;false-非空
	 */
	public static boolean unVisitedUrlsEmpty() {
		return unVisitedUrl.isEmpty();
	}

}


package com.iteye.injavawetrust.gethtml;

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class Constants {
	
	public static String URL = "http://www.jqu.net.cn";
	
	public static String HTMLPATH = "E:\\InJavaWeTrust\\jsoup\\html\\";

}


package com.iteye.injavawetrust.gethtml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;

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

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class JsoupUtil {
	
	private JsoupUtil() {
		
	}
	
	private static final JsoupUtil instance = new JsoupUtil();
	
	public static JsoupUtil getInstance() {
		return instance;
	}
	
	/**
	 * 初始化待访问URL队列
	 * @param url URL
	 */
	public void initUnvisitedUrl(String url) {
		HtmlQueue.addUnvisitedUrl(url);
	}
	
	/**
	 * 获取URL
	 * @param url URL
	 * @return URL
	 */
	public Set<String> getAllUrl(String url){
		Set<String> urls = new HashSet<String>();
		try {
			Document document = Jsoup.connect(url).timeout(5000).get();
			Elements hrefs = document.select("a[href]");
			Iterator<Element> hrefIter = hrefs.iterator();
			while (hrefIter.hasNext()) {
				Element href = hrefIter.next();
				urls.add(href.attr("href"));
			}
			Elements srcs = document.select("img[src]");
			Iterator<Element> srcIter = srcs.iterator();
			while(srcIter.hasNext()){
				Element src = srcIter.next();
				urls.add(src.attr("src"));
			}
			Elements opts = document.select("option[value]");
			Iterator<Element> optIter = opts.iterator();
			while(optIter.hasNext()){
				Element opt = optIter.next();
				urls.add(opt.attr("value"));
			}
			Elements links = document.select("link[href]");
			Iterator<Element> linkIter = links.iterator();
			while(linkIter.hasNext()){
				Element li =  linkIter.next();
				urls.add(li.attr("href"));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return urls;
	}
	
	/**
	 * 得到html内容和html名称
	 * @param url URL
	 * @return map[html-内容;title-名称]
	 */
	public Map<String, String> getHtml(String url){
		Map<String, String> map = new HashMap<String, String>();
		try {
			Document document = Jsoup.connect(url).timeout(5000).get();
			map.put("html", document.html());
			map.put("title", url.replaceAll("/", "").replaceAll(":", ""));
		} catch (IOException e) {
			System.out.println("This is html has exception [" + url + "]");
			System.out.println(e.getMessage());
		}
		return map;
		
	}
	
	/**
	 * URL是否以html结尾
	 * @param url
	 * @return true-是;false-否
	 */
	public boolean checkURL(String url) {
		String html = url.substring(url.lastIndexOf(".") + 1);
		return "html".equals(html) ? true : false;
	}
	
	/**
	 * 将html写入本地文件
	 * @param htmlText html内容
	 * @param htmlName html名称
	 */
	public void getHtmlToLocal(Map<String, String> map){
		Writer writer = null;
		try {
			writer = new OutputStreamWriter(new FileOutputStream(new File(
					Constants.HTMLPATH + map.get("title"))), "UTF-8");
			writer.write(map.get("html"));
			writer.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 毫秒转换成hhmmss
	 * @param ms 毫秒
	 * @return hh:mm:ss
	 */
	public String msToss(long ms) {
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
		formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
		String ss = formatter.format(ms);
		return ss;
	}
	
}

 

 

 

运行结果:

 

This is html has exception [http://www.jqu.net.cn/node/1166/10483.html]

404 error loading URL http://www.jqu.net.cn/node/1166/10483.html

This is html has exception [http://www.jqu.net.cn/node/459/16310.html]

404 error loading URL http://www.jqu.net.cn/node/459/16310.html

This is html has exception [http://www.jqu.net.cn/node/459/16310.html]

404 error loading URL http://www.jqu.net.cn/node/459/16310.html

This is html has exception [http://www.jqu.net.cn/node/858/16309.html]

404 error loading URL http://www.jqu.net.cn/node/858/16309.html

共下载 [3537]

用时 [00:04:20]

 

jsoup爬虫案例 jsoup爬虫案例...................................................................................。。。。。。。。。。。。。。。 立即下载

相关推荐

jsoup的jar包及例子

jsoupjar包,附带例子,有jsoup的使用说明

Java实现简单爬虫的学习

1: 网络爬虫是做什么的? 他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径, 然后继续访问,继续解析;继续查找需要的这就是网络爬虫主要干的工作. 下面是流程图: 2、通过上面的流程图 能大概了解到网络爬虫干了哪些活 ,根据这些 也就能设计出一个简单的网络爬虫出来.一个简单的...

weixin_44172607的博客 304

java html解析 工具jsoup和一个简单例子

Java解析html的实用工具jsoup和它一个简单的例子,方便使用jsoup进行html的解析

Jsoup使用教程以及使用案例

jsoup 是一款基于 Java 的HTML解析器,它提供了一套非常省力的API,不但能直接解析某个URL地址、HTML文本内容,而且还能通过类似于DOM、CSS或者jQuery的方法来操作数据,所以 jsoup 也可以被当做爬虫工具使用,从网站获取dom结构,从而解析下载数据。tagname: 通过标签查找元素,例如通过"a"来查找< a >标签。#id: 通过ID查找元素,比如通过#logo查找< p id=“logo”>

苍煜 2万+

C语言——预处理指令

return 0;这里是可以编译通过的,运行结果也是对的:;;return 0;这里编译器会报错:这里是有语法错误的。在C语言中,#include是一个预处理指令,用于将一个源文件的内容插入到另一个源文件中。这通常用于包含标准库或自定义库的头文件,以便在程序中使用这些库中定义的函数、类型和宏。#include或:用于包含标准库头文件。查找策略是,编译器会在标准库头文件目录中查找这些文件。:用于包含用户自定义的头文件。

Stewie Lee的博客 3190

ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优

高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平

weixin_32496547的博客 389

java jsoup实例_Jsoup应用实例

在本篇文章中,将列出了一些常用的jsoup例子,例如获取URL或HTML文档的标题,链接,图像和元数据。1. 获取URL的标题Document doc = Jsoup.connect("http://www.yiibai.com").get();String title = doc.title();2. 从HTML文件获取标题Document doc = Jsoup.parse(new File(...

weixin_35930535的博客 389

渗透测试实战—云渗透(AK/SK泄露)

渗透测试实战思路分享:getshell方法及横向移动方法,云安全(AK/SK泄露)

网安日记本的博客 4051

Java爬虫利器:Jsoup详细介绍与用法

使用Java库Jsoup,我们可以轻松地解析和处理HTML文档,从而从网页中提取所需的信息。我们可以使用选择器和查找元素的功能快速定位和提取元素,使用提取元素属性和文本的功能获取所需的内容,使用遍历和修改元素的功能对元素进行操作,甚至可以使用Jsoup处理HTML表单。Jsoup是一款功能强大且易于使用的Java爬虫专用库,相信通过本文的介绍,您已经对Jsoup有了更深入的了解,并能够灵活运用它来解决实际问题。让我们一起享受用Jsoup编写爬虫程序的乐趣吧!

hitpter的专栏 4565

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

linux安装配置Mysql详细步骤

下载Mysql rpm包 官网下载:https://dev.mysql.com/downloads/mysql/ 如果你到了这里,本地应该有了如下四个rpm包: mysql-community-client-5.7.26-1.el6.x86_64.rpm mysql-community-common-5.7.26-1.el6.x86_64.rpm mysql-community-libs-5...

🏆 前端领域优质创作者 7万+

java jsoup 网络爬虫 jsoup解析html Java爬虫 Jsoup爬虫 jsoup例子

java jsoup 网络爬虫 java jsoup 网络爬虫 学习例子(一)抓取豆瓣电影名称+推荐星级 java jsoup 网络爬虫 学习例子(二)只抓取豆瓣电影5星(力荐)电影名称 java jsoup 网络爬虫 学习例子(三)抓取豆瓣电影海报图片 下载到本地 java jsoup 网络爬虫 学习例子(四)抓取网页连接插入mysql数据库 java ...

18万+

智能绿植管家:基于 ESP32 的室内植物自动补光与环境调控系统

本文设计的基于 ESP32 的室内植物自动补光与生长环境调控系统,实现了植物生长环境的自动化、智能化管理。硬件选型合理、接线简单,软件逻辑清晰、易于调试,能够有效解决室内植物生长环境不适的问题。系统具备良好的实用性和扩展性,可为园艺爱好者和小型培育场所提供稳定、高效的植物养护方案。

weixin_42300449的博客 148

Jsoup 网络爬虫 学习例子

发现一个很好的jsoup的学习博客,整理如下: 作者地址:http://injavawetrust.iteye.com/java jsoup 网络爬虫 学习例子(一) 抓取豆瓣电影名称+推荐星级 java jsoup 网络爬虫 学习例子(二) 只抓取豆瓣电影5星(力荐)电影名称 java jsoup 网络爬虫 学习例子(三)抓取豆瓣电影海报图片 下载到本地 java jsoup 网络爬虫 学

我家有个艳的博客 845

全景相机APP

以下是一款**全景相机APP**的完整源码,支持全景照片拍摄(多帧拼接)、全景预览、鱼眼矫正、图片保存/分享、360°全景查看等核心功能,基于Android原生Camera2 API(替代过时的Camera API) + OpenCV(图像拼接) + GLSurfaceView(全景预览)实现,适配Android 8.0+设备,可直接编译运行。runOnUiThread(() -> tvFrameCount.setText("已拍摄:" + frameCount + "帧"));// X轴旋转(上下)

寒寒豆豆软件公司的博客 181

Python经典编程习题100例:第32例:相反顺序输出列表

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 按相反的顺序输出列表的值。 解题思路: > 利用reverse函数逆序 代码: arr=['f','g','e','b'] print(arr) arr.reverse() print(arr) ...

优快云 精品推荐 1419

网络爬虫原理

1、网络爬虫原理 网络爬虫指按照一定的规则(模拟人工登录网页的方式),自动抓取网络上的程序。简单的说,就是讲你上网所看到页面上的内容获取下来,并进行存储。网络爬虫的爬行策略分为深度优先和广度优先。如下图是深度优先的一种遍历方式是A到B到D 到E 到C到 F(ABDECF)而宽度优先的遍历方式ABCDEF 。 2、写网络爬虫的原因 我将为什么写网络爬虫的原因总结为3点,分别是:

Nathan_f的博客 1309

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java宽度优先爬虫例子

<br />Java宽度优先爬虫例子<br /><br /> 1宽度优先遍历是爬虫中使用最广泛的一种爬虫策略.<br /> 如图:<br /><br /><br /> Todo表       Visited表<br /> A                 空<br /> BCDEF         A<br /> CDEF           AB<br /> DEF             ABC<br /> <br /> <br />EF               ABCD<br />

我的博客 1392

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

网络爬虫(1)

参考:http://www.cnblogs.com/dongkuo/p/4851735.html 算法分析 我们现在从需求中提取关键词来逐步分析问题。 首先是“种子节点”。它就是一个或多个在爬虫程序运行前手动给出的URL(网址),爬虫正是下载并解析这些种子URL指向的页面,从中提取出新的URL,然后重复以上的工作,直到达到设定的条件才停止。 然后是“...

aipiannian6725的博客 130

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

爬虫抓取BestCoder的比赛排名

爬虫是个非常有意思的东西,它是根据网页上的文件结构来抓取相应内容的技术。由于最近ACM省赛在即,我负责统计做题,所以便用java写了个抓取BestCoder比赛情况的爬虫程序。 先来说说爬虫的几种抓取策略。 抓取策略     在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面

路漫漫 始于足下 2306

android 爬虫服务器,Android编写简单的网络爬虫

一、网络爬虫的基本知识网络爬虫通过遍历互联网络,把网络中的相关网页全部抓取过来,这体现了爬的概念。爬虫如何遍历网络呢,互联网可以看做是一张大图,每个页面看做其中的一个节点,页面的连接看做是有向边。图的遍历方式分为宽度遍历和深度遍历,但是深度遍历可能会在深度上过深的遍历或者陷入黑洞。所以,大多数爬虫不采用这种形式。另一方面,爬虫在按照宽度优先遍历的方式时候,会给待遍历的网页赋予一定优先级,这种叫做带...

weixin_39875028的博客 756

java网络爬虫学习记录(一)概述

爬虫概述

memoryCoderC的博客 791

爬虫入门——01

爬虫入门——011. 引言 从今天开始系统的学习网络爬虫。写这篇博客的目的在于,一来记录下自己的学习过程;二来希望可以给像我一样不懂爬虫但又对爬虫十分感兴趣的人带来一些帮助。 昨天去图书馆找有关爬虫书籍,居然寥寥无几,且都是泛泛而谈。之后上某宝淘来淘去,只找到一本相关书籍《自己动手写网络爬虫》,虽然在某瓣上看到此书的无数差评,但最终还是忍痛买下…… 对我而言,学习爬虫不...

114

Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2

Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2   1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2. 实现类库框架2 3. 问题与难点(html转txt)2 4. 参考资料3     1. 数据采集 主要获取pagesUrls,artUrls, pi

attilax的专栏 698
上一篇: java jsoup 网络爬虫 学习例子(四)抓取网页连接插入mysql数据库
下一篇: java jsoup 网络爬虫 学习例子(六)京东和当当商品比价
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值