新用户注册入口 老用户登录入口

[转载]Java爬虫学习一一Jsoup爬取彼岸桌面分类下的图片

文章作者:转载 更新时间:2023-06-12 10:26:04 阅读数量:129
文章标签:网络爬虫JsoupJava实现图片爬取URL链接分析分类页面抓取
本文摘要:本文通过Java语言结合Jsoup库实现了一个网络爬虫项目,主要针对彼岸桌面网站进行图片爬取。首先对目标网页结构进行了细致分析,识别出不同分类及其分页链接规则,并利用DOM解析技术定位到图片元素。通过动态获取总页数与遍历页面,抓取高清大图链接并下载至本地指定目录(以分类存储)。在实现过程中,重点解决了由JS生成的分页信息提取、不规则图片链接过滤等问题,成功实现了从分类页面到详细页面的图片批量爬取和存储。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_39693281/article/details/108463868。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

最近在找工作,在这个过程中我感到很迷茫,投了很多简历,被查看的却很少,其中也有到现场去面试,结果也很不理想(╥╯^╰╥)。

哈哈,跑题了,我在看之前所做的项目时,在我的收藏夹中看到了以前收藏的有关爬虫的文章,点开后又重新学习了一下。

下面是这两篇文章的链接

java实现网络爬虫:https://www.cnblogs.com/1996swg/p/7355577.html

Jsoup教程:https://www.jianshu.com/p/fd5caaaa950d

接下来,我通过Jsoup来实现爬取彼岸桌面里面的图片进行爬虫学习!!!

我用的开发工具是IDEA,jdk是1.7版本,项目结构大致如下所示:

一、页面分析

首先来分析一下彼岸桌面的网页的结构:

我们第一个看到的是网站的域名为http://www.netbian.com/,它有如上所示的分类,我们尝试着点开一些分类去看一下他的链接。

通过点击每个分类,发现不同的分类下,地址栏显示为域名后面拼接这对应分类的拼音,但在分类为王者荣耀之后的拼接的确是“s/分类拼音”。这样我们可以创建一个枚举类,将所有分类集中管理。在common包下创建一个Kind枚举类:

package com.asahi.common;/*** 分类的枚举*/
public enum Kind {RILI("rili"), DONGMAN("dongman"), FENGJING("fengjing"), MEINV("meinv"), YOUXI("youxi"), YINGSHI("yingshi"),DONGTAI("dongtai"), WEIMEI("weimei"), SHEJI("sheji"), KEAI("keai"), QICHE("qiche"), HUAHUI("huahui"),DONGWU("dongwu"), JIERI("jieri"), RENWU("renwu"), MEISHI("meishi"), SHUIGUO("shuiguo"), JIANZHU("jianzhu"),TIYU("tiyu"), JUNSHI("junshi"), FEIZHULIU("feizhuliu"), QITA("qita"), WANGZHERONGYAO("s/wangzherongyao"), HUYAN("s/huyan"), LOL("s/lol");String kind;Kind(String kind) {this.kind = kind;}public static boolean contains(String test) {for (Kind c : Kind.values()) {if (c.kind.equals(test)) {return true;} }return false;}
}

这里我添加了一个比较的方法供之后判断输入的分类名是否包含在这些分类里面。

接下来我们在分析分类面的展示情况,以美女分类页面为例(●´∀`●),最下边有分页,如果只获取这个页面的图片并不能获取所有美女图,我们还需要点击每一个分页,从分页中获取所有的图片。通过分析发现,第一页的链接是在原有链接基础上拼接“/index.htm”,从第二页之后拼接的是“/index_页号.htm”。

这样我们只需要获取总页数在依次遍历拼接就可以了,现在的问题是如何获取总页数,我一开始的想法是获取分页中“共167页”这个标签后再只保留数字就可以个,但发现运行后获取不到该元素节点,经过排查了解到这个标签是通过js生成的,于是我转换了思路,通过获取最后一个页号来得到一共分了多少页

Document root_doc = Jsoup.connect("http://www.netbian.com/" + kind + "/").get();
Elements els = root_doc.select("#main .page a");
//这里els.eq(els.size() - 2的原因是后边确定按钮用的是a标签要去掉,再去掉一个“下一页”标签
Integer page = Integer.parseInt(els.eq(els.size() - 2).text()); 

分类页中图片所在的标签结构为:

分类页面下的图片不是我们想要的,我们想要的是点击进去详细页的高清大图,所以需要获取a标签的链接,再从这个链接中获取真正想要的图片。

详细页中图片所在的标签结构为:

二、代码实现

到这里分类页分析的差不多了,我们通过代码来进行获取图片。首先导入Jsoup的jar包:jsoup-1.12.1.jar,如果采用Maven请导入下边的依赖。

<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>

在utils创建JsoupPic类,并添加getPic方法,代码如下:

public static void getPic(String kind) throws Exception {//get请求方式进行请求Document root_doc = Jsoup.connect("http://www.netbian.com/" + kind + "/").get();//获取分页标签,用于获取总页数Elements els = root_doc.select("#main .page a");Integer page = Integer.parseInt(els.eq(els.size() - 2).text());for (int i = 1; i < page; i++) {Document document = null;//这里判断的是当前页号是否为1,如果为1就不拼页号,否则拼上对应的页号if (i == 1) {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index.htm").get();} else {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index_" + i + ".htm").get();}//获取每个分页链接里面a标签的链接,进入链接页面获取当前图拼的大尺寸图片Elements elements = document.select("#main .list li a");for (Element element : elements) {String href = element.attr("href");String picUrl = "http://www.netbian.com" + href;Document document1 = Jsoup.connect(picUrl).get();Elements elements1 = document1.select(".endpage .pic p a img");//获取所有图片的链接System.out.println(elements1);} }}

在分类页中有一个隐藏的问题图片:

正常的图片链接都是以“/”开头,以“.htm”结尾,而每个分类下的第三张图片的链接都是“http://pic.netbian.com/”,如果不过滤的话会报如下错误:

所以这里必须要判断一下:

Elements elements = document.select("#main .list li a");
for (Element element : elements) {String href = element.attr("href");//判断是否是以“/”开头if (href.startsWith("/")) {String picUrl = "http://www.netbian.com" + href;Document document1 = Jsoup.connect(picUrl).get();Elements elements1 = document1.select(".endpage .pic p a img");System.out.println(elements1);}
}

到这里,页面就已经分析好了,问题基本上已经解决了,接下来我们需要将图片存到我们的系统里,这里我将图片保存到我的电脑桌面上,并按照分类来存储图片。

首先是要获取桌面路径,在utils包下创建Download类,添加getDesktop方法,代码如下:

public static File getDesktop(){FileSystemView fsv = FileSystemView.getFileSystemView();File path=fsv.getHomeDirectory();  return path;
}

接着我们再该类中添加下载图片的方法:

//urlPath为网络图片的路径,savePath为要保存的本地路径(这里指定为桌面下的images文件夹)
public static void download(String urlPath,String savePath) throws Exception {// 构造URLURL url = new URL(urlPath);// 打开连接URLConnection con = url.openConnection();//设置请求超时为5scon.setConnectTimeout(5*1000);// 输入流InputStream is = con.getInputStream();// 1K的数据缓冲byte[] bs = new byte[1024];// 读取到的数据长度int len;// 输出的文件流File sf=new File(savePath);int randomNo=(int)(Math.random()*1000000);String filename=urlPath.substring(urlPath.lastIndexOf("/")+1,urlPath.length());//获取服务器上图片的名称filename=new java.text.SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())+randomNo+filename;//时间+随机数防止重复OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename);// 开始读取while ((len = is.read(bs)) != -1) {os.write(bs, 0, len);}// 完毕,关闭所有链接os.close();is.close();}

写好后,我们再完善一下JsouPic中的getPic方法。

public static void getPic(String kind) throws Exception {//get请求方式进行请求Document root_doc = Jsoup.connect("http://www.netbian.com/" + kind + "/").get();//获取分页标签,用于获取总页数Elements els = root_doc.select("#main .page a");Integer page = Integer.parseInt(els.eq(els.size() - 2).text());for (int i = 1; i < page; i++) {Document document = null;//这里判断的是当前页号是否为1,如果为1就不拼页号,否则拼上对应的页号if (i == 1) {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index.htm").get();} else {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index_" + i + ".htm").get();}File desktop = Download.getDesktop();Download.checkPath(desktop.getPath() + "\\images\\" + kind);//获取每个分页链接里面a标签的链接,进入链接页面获取当前图拼的大尺寸图片Elements elements = document.select("#main .list li a");for (Element element : elements) {String href = element.attr("href");if (href.startsWith("/")) {String picUrl = "http://www.netbian.com" + href;Document document1 = Jsoup.connect(picUrl).get();Elements elements1 = document1.select(".endpage .pic p a img");Download.download(elements1.attr("src"), desktop.getPath() + "\\images\\" + kind);} }} }

在Download类中,我添加了checkPath方法,用于判断目录是否存在,不存在就创建一个。

public static void checkPath(String savePath) throws Exception {File file = new File(savePath);if (!file.exists()){file.mkdirs();} }

最后在mainapp包内创建PullPic类,并添加主方法。

package com.asahi.mainapp;import com.asahi.common.Kind;
import com.asahi.common.PrintLog;
import com.asahi.utils.JsoupPic;import java.util.Scanner;public class PullPic {public static void main(String[] args) throws Exception {new PullPic().downloadPic();}public  void downloadPic() throws Exception {System.out.println("启动程序>>\n请输入所爬取的分类:");Scanner scanner = new Scanner(System.in);String kind = scanner.next();while(!Kind.contains(kind)){System.out.println("分类不存在,请重新输入:");kind = scanner.next();}System.out.println("分类输入正确!");System.out.println("开始下载>>");JsoupPic.getPic(kind);}
}

三、成果展示

最终的运行结果如下:

最终的代码已上传到我的github中,点击“我的github”进行查看。

在学习Java爬虫的过程中,我收获了很多,一开始做的时候确实遇到了很多困难,这次写的获取图片也是最基础的,还可以继续深入。本来我想写一个通过多线程来获取图片来着,也尝试着去写了一下,越写越跑偏,暂时先放着不处理吧,等以后有时间再来弄,我想问题应该不大,只是考虑的东西有很多。希望大家多多指点不足,有哪些需要改进的地方,我也好多学习学习๑乛◡乛๑。

本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_39693281/article/details/108463868。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
网络爬虫网络爬虫是一种自动浏览互联网并抓取网页数据的程序或脚本,它通过模拟人类浏览器的行为,遵循URL链接在网络中遍历,并使用HTML解析库(如Jsoup)对抓取到的页面内容进行解析和信息抽取。在本文语境中,作者通过Java编程语言实现了一个网络爬虫项目,用于从彼岸桌面网站上爬取各类分类图片。
JsoupJsoup是一个用Java编写的开源库,专注于处理(解析、操作、清洗)HTML文档。它提供了一套基于DOM、CSS选择器以及便捷API的方法,使得开发者能够轻松地提取和操作HTML中的数据。在本文中,Jsoup被用来解析彼岸桌面网站的HTML结构,定位并获取图片链接等所需信息。
DOM解析DOM(Document Object Model,文档对象模型)是一种跨平台、与语言无关的接口,用于表示XML和HTML等格式文档的标准信息模型。DOM解析是指将整个HTML文档加载到内存中,形成一个树状结构(节点树),允许开发者通过编程方式动态访问和修改文档的内容、结构及样式。在文章所述的网络爬虫项目中,利用Jsoup进行DOM解析,以识别并提取目标网页上的图片链接及其他相关信息。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在进行网络爬虫开发时,Java与Jsoup库的结合无疑为开发者提供了强大的网页抓取和解析能力。实际上,随着数据驱动时代的发展,网络爬虫技术不仅被广泛应用在信息聚合、数据分析等领域,也引起了法律与伦理层面的关注。
近期,《个人信息保护法》等相关法律法规的出台,对网络爬虫的使用提出了更为严格的规范要求。例如,在未经用户授权的情况下,爬取并存储他人网站图片可能涉及侵犯版权及个人信息问题。因此,在实际操作中,除了掌握技术手段外,还需遵循相关法规,如robots.txt协议,并尊重网站的版权声明和服务条款。
同时,为了应对日益复杂的动态加载内容和反爬机制,开发者需要不断更新技术和策略,比如利用Selenium等工具模拟用户行为动态渲染页面,或者研究新的网络请求伪装方法以绕过反爬策略。此外,对于海量数据的高效爬取与存储,分布式爬虫框架(如Scrapy)以及云存储解决方案(如阿里云OSS、AWS S3)的应用也成为现代爬虫工程的重要组成部分。
总而言之,在探索网络爬虫技术深度的同时,务必关注行业动态,紧跟法规政策走向,并在实践中不断提升道德和技术双重素养,确保网络爬虫项目的合规、高效运行。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
df -h - 查看磁盘空间使用情况。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
纯js实用T恤衫花纹图案预览特效 01-26 基于Bootstrap仿Github样式下拉列表框插件 08-08 jQuery电子邮件地址填写自动完成插件 04-30 Superset 数据源连接配置:精细化自定义SQLAlchemy URI实现数据分析与可视化,含SSL加密连接实例 03-19 jquery可任意拖动排序的导航图片效果 02-23 侧边栏个人图文简历HTML模板 12-09 Beego框架升级中的Bee工具版本兼容性问题与迁移策略:结构变更、功能接口变动及社区解决方案 12-07 Kibana无法启动:针对服务器内部错误的Elasticsearch连接、配置文件、端口冲突与资源排查解决(注:由于字数限制,未能完全包含所有关键词,但包含了核心问题描述及几个关键排查点) 11-01 ClickHouse外部表使用中文件权限与不存在问题的解决方案:错误提示、查询操作与文件路径管理实务 09-29 本次刷新还10个文章未展示,点击 更多查看。
Apache Atlas UI无法正常加载与样式丢失问题排查及解决方案:关注网络连接、浏览器缓存与开发者工具应用 09-25 Greenplum数据库中数据插入操作详解:单行多行插入与gpfdist实现大批量导入 08-02 [转载]html5 footer header,html-5 --html5教程article、footer、header、nav、section使用 07-16 [转载][GCC for C]编译选项---IDE掩盖下的天空 06-29 简洁大方珠宝钻石收藏网站模板下载 06-20 黑色高端精致汽车4s店美容html5模板下载 06-01 蓝色互联网项目融资管理平台网站模板 05-16 响应式游戏开发类企业前端cms模板下载 05-02 Beego框架动态路由实现:重定向与命令行参数驱动的路由设计实践 04-05 .NET 中字典操作避免 KeyNotFoundException:TryGetValue、ContainsKey 与 GetOrAdd 实践详解 04-04 [转载]2021/4/23爬虫第五次课(爬虫网络请求模块下下) 03-01
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"