通过URL对象实现简单爬虫功能

news2025/2/22 13:09:40

目录

一、URL类

1. URL类基本概念

2. 构造器

3. 常用方法

 

二、爬虫实例

1. 爬取网络图片(简易)

2. 爬取网页源代码

3. 爬取网站所有图片


一、URL类

1. URL类基本概念

URL:Uniform Resource Locator 统一资源定位符

  1. 表示统一资源定位符,指向万维网上的“资源”的指针。用于区分、定位资源
  2. 一个标准的URL必须包括:protocol(方案或协议)、host(主机)、port(端口)、path(路径)、parameter(查询参数)、anchor(锚点)
  3. 通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。
  4. 如 :http://www.goole.com:80/index.html , 分四部分组成:协议、存放资源的主句域名、端口号、资源文件名

2. 构造器

构造器说明
URL(String spec)从String表示形成一个UL对象

3. 常用方法

常用方法说明
String getProtocol()获取此URL的协议名称
String getHost()获取此URL的主机名
Int getPort()获取此URL的端口号
String getPath()获取此URL的路径部分
String getFile()获取此URL的文件名
String getQuery()获取参数
String getRef()获取锚点

二、爬虫实例

1. 爬取网络图片(简易)

第一步:也是最重要的一步!首先找到一张非常man的图片然后赋值图像路径

 第二步:编码

/** 通过URL对象完成简单的爬虫功能(保存网络图片) */
		try {// 创建URL对象 , 将网络资源路径传递到对象进行绑定
			URL url = new URL("https://pic3.zhimg.com/v2-41d65e3171d35d24f3fda527377ab2b6_r.jpg");
			// 通过ur1对象打来并且激活网络流来获取该图片资源
			// 同字节输入流(边读边写操作)
			InputStream is = url.openStream();
			// 创建爬虫后要写入的文件
			FileOutputStream fos = new FileOutputStream(new File("E:\\man.jpg"));
			int len = 0;
			while ((len = is.read()) != -1) {
				fos.write(len);
			}
			// 关团资源
			fos.close();
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

最后运行代码就可在指定爬到磁盘找到文件啦

2. 爬取网页源代码

第一步:先在指定磁盘新建一个txt文件用于保存爬下的资源

第二步:找到一个网站将网站路径赋值下来

第三步:编码

/** 通过URL对象完成简单的爬虫功能(保存网页源代码) */
		try {
			// 创建URL对象,将网络资源路径传递到该对象进行绑定
			URL url2 = new URL("https://blog.csdn.net/Justw320/article/details/131817953");
			// 通过ur1对象打开并且激活网络流来获取网页资源
			InputStream openStream = url2.openStream();
			InputStreamReader read = new InputStreamReader(openStream, "UTF-8");
			BufferedReader br = new BufferedReader(read);
			// 创建爬虫后要写入的文件
			FileOutputStream fos = new FileOutputStream(new File("E:\\url.txt"));
			OutputStreamWriter osw = new OutputStreamWriter(fos);
			BufferedWriter bw = new BufferedWriter(osw);
			// 定文空变量来储存爬下来的内容
			String str = "";
			while ((str = br.readLine()) != null) {
				bw.write(str);
				bw.newLine();
				bw.flush();
			}
			// 关团资源
			bw.close();
			osw.close();
			fos.close();
			br.close();
			read.close();
			openStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

最后运行代码找到之前新建的txt文件:

3. 爬取网站所有图片

        首先找个没有动态源代码的的网页就是不是通过js传值的,很难找,小编也是找了自己的博客网站进行爬取,现在大多数网站都有反爬虫技术😭,有兴趣的可以去自行扩展都是可刑的👍,这里只是一个案例供参考!

package com.net;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @author 云村小威
 *
 * @2023年7月21日 上午10:48:54
 */
public class Getphoto {
	public static void main(String[] args) throws Exception {
		// 定义URL对象,传入网络资源路径
		URL url = new URL("https://blog.csdn.net/Justw320/article/details/131817953");
		// 通过url对象打开网络流来获取网络资源
		InputStream openStream = url.openStream();
		// 转换字符流并优化缓冲
		BufferedReader br = new BufferedReader(new InputStreamReader(openStream, "UTF-8"));
		// 每次读取一行,拼接到变量中
		StringBuffer sb = new StringBuffer(); // 保存源码信息
		String str = "";
		while ((str = br.readLine()) != null) {
			// 每次读取一行拼接到sb变量中
			sb.append(str + "\n");
		}
		// 关闭流
		br.close();
		openStream.close();

		/**
		 * 获取源码内容,进行正则处理 拿到源码所有img内容
		 */
		// 将源码信息转成字符串进行保存
		String count = sb.toString();
		// 定义正则表达式
		//<img src="https://csdnimg.cn/identity/nocErtification.png" alt="">
		String zheng = "<img\\ssrc=\"https://([^>\"]+)\">";
		// 给正则表达式一个匹配模式
		Pattern compile = Pattern.compile(zheng);
		Matcher matcher = compile.matcher(count);
		// 循环所有正则规定的表达式路径
		while (matcher.find()) {
			// 1.构建URL
			URL imgUrl = new URL("http://" + matcher.group(1));
			/* 取到子字符串中的src分组中的值(图片地址) */
			String group = matcher.group(1);
			/* 取到图片的名字 */
			String fileName = group.substring(group.lastIndexOf("/"));
			// 2.打开网络流 并将字节转成缓冲字节流
			InputStream openStream2 = imgUrl.openStream();
			BufferedInputStream bis = new BufferedInputStream(openStream2);
			// 输出流 将图片写入到指定文件中
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream(new File("E:\\imgs" + fileName)));
			// 每次读取一个字节数组
			byte[] bytes = new byte[1024];
			int len = 0;
			while ((len = bis.read(bytes)) != -1) {
				// 写入到文件中
				bos.write(bytes);
				bos.flush();
			}
			// 关闭资源
			bos.close();
			bis.close();
			openStream2.close();
		}
	}

}

 

1. 通过代码打印count变量(这里就一个一个运行了,可参考代码这里的count是通过url爬取到的所有源代码)

 

2. 找到img(图片标签), 找到它们的规律设置正则这里很重要!

最后运行代码,就可在指定爬取路径查看爬取到的图片了!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop——Hive相关问题汇总

(1) 连接数据库时SSL问题 解决方法&#xff1a;useSSLfalse要放最后 (2) jdbc:hive2://localhost:10091: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): Us…

银河麒麟服务器v10 sp1 nginx 部署项目

上一篇&#xff1a;银河麒麟服务器v10 sp1 nginx开机自动启动_csdn_aspnet的博客-CSDN博客 由于项目为前后端分离&#xff0c;前端项目使用nginx部署&#xff0c;VUE项目打包后上传至银河麒麟服务器&#xff1a; 8063 为前端项目文件目录&#xff0c;修改配置 &#xff0c;默认…

计算机基础专升本笔记四 计算机系统

计算机基础专升本笔记四 计算机系统 计算机系统 计算机系统由计算机硬件系统和计算机软件系统 组成。且是按照存储程序的方式工作的。计算机硬件就是由各种电子器件按照一定逻辑连接而成&#xff0c;看的见摸得着&#xff0c;是计算机系统的物质基础&#xff0c;计算机软件系统…

港科夜闻|第二届钟南山青年科技创新奖发布仪式在香港科大(广州)成功举办...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、第二届钟南山青年科技创新奖发布仪式在香港科大&#xff08;广州&#xff09;成功举办。本次活动由中国青年科技工作者协会、中国青年创业就业基金会、钟南山青年科技创新奖评审委员会、共青团广东省委员会、广州市南沙开…

axios请求本地json文件

1.安装axios npm install axios --save 2.在main.js中引入 import { createApp } from vue import axios from axios import VueAxios from vue-axios const app createApp(App) app.config.globalProperties.$http axios; app.use(VueAxios, axios) 3.在根目录下的publi…

什么小程序需要社交相关类目?

1、陌生人交友&#xff1a;小程序内涉及提供在线陌生人交友服务&#xff0c;需补充社交-陌生人交友类目。 所需资质&#xff1a;《增值电信业务经营许可证》&#xff08;核准服务项目包含“互联网信息服务业务”&#xff09; 案例&#xff1a;如下图小程序涉及通过展示用户微…

【JAVA】云HIS系统功能菜单知识(三)

云HIS系统能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能。 四、住院医生站 1.医嘱管理 登记信息、主治医生、患者信息、床位号、病案编号、住院号、身份证号、入…

从零到一nvm、npm、cnpm、yarn、vue全套安装和环境配置以及创建新项目和如何运行人家的项目大全,最详细,保姆级

NVM 1.下载 下载地址&#xff1a;Releases coreybutler/nvm-windows GitHub 可能需要开启魔法 划到下面。找到如图所示的文件下载即可2. 2.安装&#xff08;要记住安装的路径&#xff09; 基本一键默认即可&#xff0c;你要修改路径也可以&#xff0c;但不建议 下载好…

Rust之泛型、特性和生命期(四):验证有生存期的引用

开发环境 Windows 10Rust 1.71.0 VS Code 1.80.1 项目工程 这里继续沿用上次工程rust-demo 验证具有生存期的引用 生存期是我们已经在使用的另一种泛型。生存期不是确保一个类型具有我们想要的行为&#xff0c;而是确保引用在我们需要时有效。 我们在第4章“引用和借用”一…

Java将数据集合转换为PDF

这里写自定义目录标题 将数据集合转换为pdf引入包工具类测试代码导出效果 将数据集合转换为pdf 依赖itext7包将数据集合转换导出为PDF文件 引入包 <properties><itext.version>7.1.11</itext.version> </properties><dependency><groupId&…

Spring、Springboot、SpringMVC之间的关系

他们之间没有明确的区分。一个项目&#xff0c;可以说是SpringMVC,又是Sprigboot,又是Spring项目。 首先简单看一下他们的定义&#xff1a; Spring是包含众多容器的IOC(控制反转)容器&#xff0c;是一个分层的轻量级框架&#xff0c;为了简化Java程序的开发。Springboot在Spr…

实例022 非矩形窗体

实例说明 大部分Windows窗体都是一个矩形区域&#xff0c;读者是否已经厌倦了这种中规中矩的矩形窗体&#xff1f;本例中的窗体是一个打破传统矩形的异型窗体&#xff0c;运行该例会看到一个非常可爱的窗体&#xff0c;单击【X】按钮就会使窗口关闭。实例效果如图1.22所示。 …

基于MATLAB的无人机遥感数据预处理与农林植被性状估算实践

遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势&#xff0c;是智慧农业必须采用的重要技术之一。本内容主要针对农业、林业、生态、遥感背景的对无人机遥感有兴趣的…

低代码平台协同OA升级,促进金融企业信息化建设

编者按&#xff1a;数字化办公是信息化时代每个企业不可避免的&#xff0c;OA系统是数字化办公的关键环节。如何与时俱进&#xff0c;保持企业的活力&#xff0c;增强企业综合竞争力&#xff1f;本文分析了企业OA系统为什么需要升级&#xff0c;并进一步指出如何实现升级。 关…

git stash 内容丢失找回【亲测好用】

直接将下列代码复制到 终端 会出现所有列表 也包括你删除/丢失的stash git log --graph --oneline --decorate $( git fsck --no-reflog | awk /dangling commit/ {print $3} ) 前面的黄色就是他的编号 例如我想回复 自己编辑修改项目 将编号复制重链即可 git stash apply …

MySQL使用

目录 1 MySQL的登录 1.1 服务的启动和终止 1.2 自带客户端的登录与退出 2 MySQL演示使用 2.1 MySQL的使用演示 2.2 MySQL的编码设置 1 MySQL的登录 1.1 服务的启动和终止 MySQL安装完毕以后&#xff0c;需要启动服务器进程&#xff0c;不然客户端无法连接数据库。 在前面…

用html+javascript打造公文一键排版系统7:落款排版

一、公文落款的格式 公文落款包括单位署名和成文日期两个部分&#xff0c;其中成文日期中的数字 用阿拉伯数字将年、月、日标全&#xff0c;年份应标全称&#xff0c;月、日不编虚位&#xff08;即 1 不编为 01&#xff09;。 在实际应用工作中分为三种情况&#xff1a; &am…

(36)转速传感器

文章目录 前言 36.1 RPM库如何工作(TYPE AUXPIN) 36.2 霍尔效应传感器 36.3 电调遥测 - 电机平均转速 36.4 电气换向传感器 36.5 光学传感器 36.6 谐波陷波中心频率 前言 ArduPilot 支持使用众多类型的转速传感器。它们通常用于传统的直升机&#xff0c;测量主旋翼速度…

java Spring Boot上线运维 启动jar时控制台调整零时变量

前面的文章 java 打包Spring Boot项目&#xff0c;并运行在windows系统中和将Spring Boot项目打包部署到阿里云linux服务器讲述了Spring Boot项目打包部署的过程 但是 这里 我们可能会遇到一种情况 此时 我们服务器 java项目占用了 80端口 但我们需要放上去一个更重要的东西&am…

M1安装服务一条龙Mysql (解决PID的不存在的方法)

遇到的各种奇葩离谱问题 dev.mysql.com/downloads/mysql/&#xff0c;登入下载就行&#xff0c;下载这块最简单&#xff0c;就不详细说明了 首先注意一个点M1可以下载ARM&#xff0c;也可以X86&#xff0c;目前暂时不用考虑效率能用就行&#xff0c;5.7也可以用哈 然后下载完&…