java实现爬虫_手把手教你从零开始用Java写爬虫

article/2025/8/27 4:54:43

本文将手把手地教大家从零开始用Java写一个简单地爬虫!

5728927861b256b6595baca9a9af7c6b.png

目标

爬取全景网图片,并下载到本地

收获

通过本文,你将复习到:

IDEA创建工程IDEA导入jar包爬虫的基本原理Jsoup的基本使用File的基本使用FileOutputStream的基本使用ArrayList的基本使用foreach的基本使用说明

爬虫所用的HTM解析器为Jsoup。Jsoup可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup相关API整理见文末附录一。

开始

一、前端分析

1、使用Chrome或其他浏览器,打开全景网,按F12进入调试模式,分析网页结构。(这里选的是“创意”=>“优山美地”)

68fc4e637151e365c51cf4587da0e16e.png

2、找规律,看图片对应的结构是什么。可以发现,每个图片的结构都如下图红框所示。

6abade7e403ab804b55e4cba3cb8e198.png

3、找到结构后再找图片链接。进一步分析后发现,图片链接可以是下图红框部分。

4c15abb2d6e131bf1f01cfe2ca2550ac.png

4、复制到浏览器打开看看验证下。(好吧,访问这个URL直接给我下载了...)

e8688b3ecba5345be91194343916de66.png

a04ab973f962255e4f426fd6d232b231.png

5、前端部分分析完毕,接下来就可以用Java编码了!

二、爬取思路

通过Java向全景网发送GET请求,以获取HTML文件。Jsoup解析后寻找class=item lazy的a标签,他的child节点(即)就是我们要找的目标节点了,搜索到的应当是一个ArrayList。然后遍历集合,从中搜寻图片的URL,并下载到本地保存。(更深一步,可以下载完一页后,继续下载后一页,直至全部下完。本文直讲下载第一页。提示一下,链接后面的topic/1其实就是当前页数)

三、Java编码

1、先下载Jsoup jar包,并导入到IDEA工程中。

0d54a74e2bc9cb41091f6e197aa6704e.png

df7e29c26d17f5d9df73b09a9d528de5.png

2、新建Java工程。

cf6a03e056daf75ff9c4b720880912d4.png

35b4f216be90651b889e6f342b04777f.png

0bd7be3c64e9cd21a92f16128d329107.png

3、简单测试下get请求,若请求成功,则进入下一步;若报错,检查URL是否带了中文。

注意:链接没给,否则文章审核不过,注意自己添加!!!

package com.sxf;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;public class Main { public static void main(String[] args) { try { Document doc = Jsoup.connect("").get(); //这里加链接 System.out.println(doc); }catch (Exception e){ e.printStackTrace(); } }}

7817c472b15ed863bf370c222b2708a1.png

4、寻找class为item lazy的元素,找到他的child节点,返回ArrayList。并将图片的URL单独提取出来。

注意:链接没给,否则文章审核不过,注意自己添加!!!

注意:链接没给,否则文章审核不过,注意自己添加!!!

aba00920d97ae70f556b31219d51da97.png

5、我们先尝试用Jsoup下载一张图片试试效果。

注意:链接没给,否则文章审核不过,注意自己添加!!!

// 获取responseConnection.Response imgRes = Jsoup.connect(URLS.get(0)).ignoreContentType(true).execute();FileOutputStream out = (new FileOutputStream(new java.io.File("demo.jpg")));// imgRes.body() 就是图片数据out.write(imgRes.bodyAsBytes());out.close();可以看到在当前工程路径下,生成了demo.jpg图片,并且显示正常!

171866ba391a275f3f6f2d653e99df57.png

6、接下来,我们要创建一个文件夹,用来专门存放图片。

File相关API整理见文末附录二。

//当前路径下创建Pics文件夹File file = new File("Pics");file.mkdir();System.out.println(file.getAbsolutePath());

35f56c01bbba5e0a64eeb388659ed13a.png

7、接下来开始遍历图片并下载。由于图片较多,为了简单起见,我们保存图片时候的名称,就从1开始依次增吧。

// 遍历图片并下载int cnt = 1;for (String str : URLS) { System.out.println(">> 正在下载:"+str); // 获取response Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute(); FileOutputStream out = (new FileOutputStream(new java.io.File(file, cnt+".jpg"))); // imgRes.body() 就是图片数据 out.write(imgRes.bodyAsBytes()); out.close(); cnt ++;}运行结果

678958f5ed2beea7a84d5bf81f08cffe.png

到此编码部分也结束了,完整代码见文末附件三!

附录一

Jsoup(HTML解析器)

继承关系:Document继承Element继承Node。TextNode继承Node。->java.lang.Object ->org.jsoup.nodes.Node ->org.jsoup.nodes.Element ->org.jsoup.nodes.Documenthtml文档:Document元素操作:Element节点操作:Node官方API:https://jsoup.org/apidocs/org/jsoup/nodes/Document.html 一、解析HTML并取其内容 Document doc = Jsoup.parse(html);二、解析一个body片断 Document doc = Jsoup.parseBodyFragment(html); Element body = doc.body();三、从一个URL加载一个Document Document doc = Jsoup.connect("http://example.com") .data("query", "Java") .userAgent("Mozilla") .cookie("auth", "token") .timeout(3000) .post(); String title = doc.title();四、从一个文件加载一个文档 File input = new File("/tmp/input.html"); // baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串 Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/"); 五、使用DOM方法来遍历一个文档 1、查找元素 getElementById(String id) getElementsByTag(String tag) getElementsByClass(String className) getElementsByAttribute(String key) // 和相关方法 // 元素同级 siblingElements() firstElementSibling() lastElementSibling() nextElementSibling() previousElementSibling() // 关系 parent() children() child(int index) 2、元素数据 // 获取属性attr(String key, String value)设置属性 attr(String key) // 获取所有属性 attributes() id() className() classNames() // 获取文本内容text(String value) 设置文本内容 text() // 获取元素内HTMLhtml(String value)设置元素内的HTML内容 html() // 获取元素外HTML内容 outerHtml() // 获取数据内容(例如:script和style标签) data() tag() tagName() 3、操作HTML和文本 append(String html) prepend(String html) appendText(String text) prependText(String text) appendElement(String tagName) prependElement(String tagName) html(String value) 六、使用选择器语法来查找元素(类似于CSS或jquery的选择器语法) //带有href属性的a元素 Elements links = doc.select("a[href]"); //扩展名为.png的图片 Elements pngs = doc.select("img[src$=.png]"); //class等于masthead的div标签 Element masthead = doc.select("div.masthead").first(); //在h3元素之后的a元素 Elements resultLinks = doc.select("h3.r > a"); 七、从元素抽取属性、文本和HTML 1、要取得一个属性的值,可以使用Node.attr(String key) 方法 2、对于一个元素中的文本,可以使用Element.text()方法 3、对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法 4、其他: Element.id() Element.tagName() Element.className() Element.hasClass(String className)

附录二

File类

*java.io.File类用于表示文件或目录。*创建File对象:// 文件/文件夹路径对象File file = new File("E:/...");// 父目录绝对路径 + 子目录名称File file = new File("..." ,"");// 父目录File对象 + 子目录名称 File file = new File("...","...");file.exists():判断文件/文件夹是否存在file.delete():删除文件/文件夹file.isDirectory():判读是否为目录file.isFile():判读是否为文件夹file.mkdir():创建文件夹(仅限一级目录)file.mkdirs():创建多及目录文件夹(包括但不限一级目录)file.createNewFile():创建文件file.getAbsolutePath():得到文件/文件夹的绝对路径file.getName():得到文件/文件夹的名字file.String():同样是得到文件/文件夹的绝对路径等于file.getAbsolutePath()file.getParent():得到父目录的绝对路径

附录三

完整代码

package com.sxf;import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.File;import java.io.FileOutputStream;import java.util.ArrayList;public class Main { public static void main(String[] args) { try { Document doc = Jsoup.connect("https://www.quanjing.com/creative/topic/1").get(); // 寻找class为item lazy的元素,返回ArrayList。 Elements items = doc.getElementsByClass("item lazy"); ArrayList URLS = new ArrayList<>(); // 将图片的URL单独提取出来。 for (Element i : items) { URLS.add(i.child(0).attr("src")); } // 当前路径下创建Pics文件夹 File file = new File("Pics"); file.mkdir(); String rootPath = file.getAbsolutePath(); System.out.println(">> 当前路径:"+rootPath); // 遍历图片并下载 int cnt = 1; for (String str : URLS) { System.out.println(">> 正在下载:"+str); // 获取response Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute(); FileOutputStream out = (new FileOutputStream(new java.io.File(file, cnt+".jpg"))); // imgRes.body() 就是图片数据 out.write(imgRes.bodyAsBytes()); out.close(); cnt ++; } }catch (Exception e){ e.printStackTrace(); } }}


http://chatgpt.dhexx.cn/article/qSfTjmIb.shtml

相关文章

java爬虫 webcollector_Java爬虫-WebCollector | 学步园

爬虫简介&#xff1a; WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核)&#xff0c;它提供精简的的API&#xff0c;只需少量代码即可实现一个功能强大的爬虫。 爬虫内核&#xff1a; WebCollector致力于维护一个稳定、可扩的爬虫内核&#xff0c;便于开发者进行…

Java爬虫高级教程-动力节点

作为网络爬虫的入门采用Java开发语言&#xff0c;内容涵盖了网络爬虫的原理以及开发逻辑&#xff0c;Java网络爬虫基础知识&#xff0c;网络抓包介绍&#xff0c;jsoup的介绍与使用&#xff0c;HttpClient的介绍与使用等内容。本课程在介绍网络爬虫基本原理的同时&#xff0c;注…

java 爬虫处理数据_Java语言实现爬虫实战

引言 网络上有许多信息&#xff0c;我们如何自动的获取这些信息呢&#xff1f;没错&#xff0c;网页爬虫~! 在这篇博文中&#xff0c;我将会使用java语言一步一步的编写一个原型的网页爬虫&#xff0c;其实网页爬虫并没有它听起来那么难。 紧跟我的教程&#xff0c;我相信你会在…

2021年Java爬虫技术教程(一小时实现)

Java爬虫开发 操作要点 正则表达式 Java网络通信&#xff1a;URL IO流 Map—HashMap 字符串操作 异常处理 项目已上传本人码云&#xff08;gitee&#xff09;传送门 如果这篇博客对你有一点点小帮助&#xff0c;希望您能给我来波一键三连&#xff1b; 前言 python优点&am…

java 爬虫大型教程(一)

java 爬虫大型教程&#xff08;一&#xff09; 写在开始前&#xff0c;既然是大型教程&#xff0c;那就从最初始的环境变量开始搭建说起。 电脑环境:我的电脑是macbook pro&#xff0c;因此系统环境变量配置是和Windows不一样的&#xff0c;如果你的电脑是Windows系统&#x…

java 爬虫 sessionid_java爬虫实战之模拟登陆

使用jsoup工具可以解析某个URL地址、HTML文本内容&#xff0c;是java爬虫很好的优势&#xff0c;也是我们在网络爬虫不可缺少的工具。本文小编带领大家使用jsoup 实现java爬虫模拟登陆&#xff0c;通过省力的API&#xff0c;很好的实现java爬虫模拟登陆。 一、使用工具&#xf…

java爬虫框架视频_Java爬虫博客采集系统视频教程

资源介绍 教程名称&#xff1a;Java爬虫博客采集系统视频教程xa0 教程目录&#xff1a; 【java爬虫博客采集系统】视频教程第00讲[20分钟] - 系统演示xa0 【java爬虫博客采集系统】视频教程第01讲[08分钟] - 博客爬虫模块Axa0 【java爬虫博客采集系统】视频教程第02讲[21分钟] …

Java版爬虫,爬网页,爬小说,完整教程,一看就会

昨天小编看到了一部不错的小说&#xff0c;但是没有办法下载&#xff0c;只能一页一页地看&#xff0c;于是想到了爬虫&#xff0c;现在Java也有了爬虫的框架&#xff0c;很简单&#xff0c;就算小白也能轻易入门&#xff0c;话不多说&#xff0c;直接上手。 1.首先引入相关依…

java-jsoup爬虫

1. 介绍 Jsoup是Java中的一个包&#xff0c;可以用于爬取页面中的数据 Jsoup爬取数据分为以下几个步骤&#xff1a; 1. 获取所爬取网页的Document对象 2. 找到所爬取数据所在的父级标签&#xff0c;将其从Document对象中解析出来&#xff0c;解析出来的内容放置在Element对象…

java爬虫 教程_Java爬虫其实也很简单,教你实用的入门级爬虫

原标题&#xff1a;Java爬虫其实也很简单&#xff0c;教你实用的入门级爬虫 任何语言都是可以爬虫的&#xff0c;只要你懂的常用的http协议啥的就可以模仿浏览器的行为获取你想要的数据。这里我将教大家一个简单实用的案例&#xff1a;如何获取全民K歌的下载链接。 ps: 这主要是…

java爬虫视频教程_JAVA开发教程:java视频教程java爬虫实战项目 百度网盘

– 源码 – 0 B |- 猫了个咪-更多IT精品课程.html – 41.00 kB |- 猫了个咪–it视频论坛.url – 51 B |- 22_项目优化三&#xff1a;邮件提醒.mp4 – 345.30 MB |- 21_项目优化二&#xff1a;爬虫项目监控[itjc8.com].mp4 – 353.40 MB |- 20-4_项目优化一&#xff1a;解决频繁…

手把手Java爬虫教学 - 1. 了解爬虫

一、什么是爬虫 先来看一下百度百科&#xff0c;了解一下爬虫~ 我们通过爬虫主要的目的就是爬取数据&#xff0c;好比 A 网站、B 网站有我们所需要的内容&#xff0c;但是这两个网站并没有给我们提供接口&#xff0c;那我们怎么能拿到上面的数据呢&#xff1f; 这时候我们就可…

java爬虫教程:模拟用户表单登录

转自&#xff1a;http://xiaolongonly.cn/2016/06/01/Reptile3/ 这个是爬虫教程第三篇&#xff0c;教大家如何模拟用户表单登录。 前期准备&#xff1a; JSOUP 1.83 jar包 Eclipse 任意版本能运行java就行 谷歌浏览器 第一步&#xff1a;依然是分析页面结构 我们要模拟C…

REmap包介绍及使用

2019独角兽企业重金招聘Python工程师标准>>> #REmap包简介 #包安装 #remapH函数 #remapH案例 #get_theme函数 #remapC函数 #markLineControl函数 #markPointControl函数 #remapC案例 REmap包简介 REmap包是R与echart的对接&#xff0c;在R里调用echar的api直接作图&…

用R语言绘制动态地图,代码奉上!(REmap包详解)

options(remap.ak="MY07CLhm3wKi4N2tQ6WP4kzz21BBZagI") 安装包 library(devtools) install_github(badbye/baidumap) install_github(lchiffon/REmap) baidumap包函数说明 getBaiduMap函数 getBaiduMap(location, width = 400, height = 400, zoom = 10, scale = …

remap()

学习自&#xff1a;【OpenCV入门教程之十七】OpenCV重映射 重映射&#xff0c;就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

REmap绘制地图

本文出自&#xff1a; http://blog.csdn.net/wzgl__wh/article/details/53108754 REmap这个包是通过调用百度地图API的一个程序包&#xff0c;与Google的ggmap包相比&#xff0c;不用翻墙就可以使用。其函数主要有&#xff1a;remap()&#xff0c;remapB()、remapC()、remapH()…

R语言:使用REmap绘制超炫酷的地图

REmap这个包是通过调用百度地图API的一个程序包,与Google的ggmap包相比,不用翻墙就可以使用。其函数主要有:remap(),remapB()、remapC()、remapH()四个。该程序包目前要github网站上,因此我们需要从github上面下载安装。 install.packages("devtools")#如果安装…

ioremap()

活动地址&#xff1a;CSDN21天学习挑战赛 前言 之前&#xff0c;我们使用 devmem 命令的方式&#xff0c;直接操作寄存器&#xff0c;控制 LED 的亮灭。 今天&#xff0c;我们在内核中使用 ioremap() 来实现该功能。 物理地址 vs 虚拟地址 在嵌入式 Linux 中&#xff0c;通常…

STM32和GD32的GPIO引脚的default(默认) alternate(引脚复用) remap(引脚重映射)三种用法 别把复用和重映射当一回事儿

STM32有很多内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用 重映射就是引脚重映射&#xff0c;本来每个内置外设都有原来设…