IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java中基于HTTP协议的爬虫技术 -> 正文阅读

[Java知识库]Java中基于HTTP协议的爬虫技术

HTTP协议

HTTP协议简介

??HTTP(超文本传输协议)是用于从万维网服务器传输超文本到本地浏览器的传送协议。超文本传输协议(HTTP)是面向事务的(Transaction-oriented),应用层协议规定了在浏览器和服务器之间的请求和响应的格式和规则,它是万维网上能够可靠交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
??通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是 80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
??通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)来标识。
??那么如何基于HTTP协议在Java中实现爬虫呢?
?1.首先做好准备工作
??这是我找到的一个下载壁纸的网页,按F12(或者在菜单-工具)打开开发者工具如下所示:
在这里插入图片描述
?2.爬取网页中的图片
??1).创建一个URL对象获取该网页的统一资源定位符(URL),调用openConnection()方法打开连接,该方法的返回值为一个URLConnection对象,使用HttpURLConnection接收,HttpURLConnection是它的子类。
??2).设置请求方式,一般都为GET请求。
??3).设置请求头(Header)属性,“User-Agent”,和上图红色框里的值一样,如果不一样会报403错误,意思是禁止恶意访问此网站,不能从此网站中抓取内容。如果是服务器端禁止抓取,那么可以通过设置 User-Agent 来欺骗服务器.。
??4).读取该网页的html
??5).提取html中的图片 <img src=“https://th.wallhaven.cc/small/y8/y8vlyk.jpg” 。这里我使用的Jsoup和一些if判断语句。调用Jsoup类的静态方法parse()可以解析字符串(html),Document类:网页文档(包含解析到的所有标签) ,Elements类:若干元素Element形成的集合(继承自ArrayList), Element类:某一个html元素。
??6).通过输入流和输出流,边读边写(如何通过输入输出流读写图片),将图片写入到指定路径。

代码展示如下:

package my.csdn;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

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

//爬取网页图片
public class webCrawler {
	public static void main(String[] args) {
		try {
			// 获取 统一资源定位符(url)
			URL url = new URL("https://wallhaven.cc/");

			// 打开连接
			// 应用层:URLConnection
			// 传输层:TCP连接
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();

			// 设置请求方式
			connection.setRequestMethod("GET");

			// 设置请求Header属性
			connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

			try (BufferedReader reader = new BufferedReader(
					new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));) {
				// <img src="https://th.wallhaven.cc/small/y8/y8vlyk.jpg"
				String line = null;
				while ((line = reader.readLine()) != null) {
					line = line.trim();// 去除字符串中的空格

					String src = "";
					// 使用Jsoup解析字符串
					// Document类:网页文档(包含解析到的所有标签)
					// Elements类:若干元素Element形成的集合(继承自ArrayList)
					// Element类:某一个html元素
					Document imageDocument = Jsoup.parse(line);

					// 获取imageDocument中所有包含“img”标签的Element对象的集合
					Elements elements = imageDocument.getElementsByTag("img");

					for (Element element : elements) {
						src = element.attr("src");
						if (src.startsWith("https://") && src.contains(".jpg")) {
							System.out.println(src);//在控制台输出一下看是否正确

							// 获取该图片的统一资源定位符()
							URL imgUrl = new URL(src);

							// 打开连接
							HttpURLConnection imgURLConnection = (HttpURLConnection) imgUrl.openConnection();
//							imgURLConnection.setRequestProperty("User-Agent", "Mozilla/4.76");

							// 获取输入流
							BufferedInputStream bis = new BufferedInputStream(imgURLConnection.getInputStream());
							// 输出流
							BufferedOutputStream bos = new BufferedOutputStream(
									new FileOutputStream("E:\\image\\壁纸\\" + System.currentTimeMillis() + ".jpg"));

							// 边读边写
							byte[] buff = new byte[1024];
							int len = -1;
							while ((len = bis.read(buff)) != -1) {
								bos.write(buff, 0, len);
							}

						}

					}

				}
			}

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

	}
}

这里我在控制台输出了下看是否图片URL是否正确:
在这里插入图片描述

运行结果:
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:22:54  更:2022-07-21 21:26:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:56:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码