java写爬虫没python好吗_java爬虫代码

java写爬虫没python好吗_java爬虫代码写在前面前段时间实习结束回来休息,某日闲逛无意间又打开了半次元,突然看见几个好漂亮的coser小姐姐,就想存个图片当壁纸(づ ̄3 ̄)づ╭❤~然而又发现,很多小姐姐都设置了作品禁止保存或者是右下角带水印身为一个重度强迫症患者,默默打开浏览器,看看能不能偷鸡扒到原图。。。开始之前1.所有图片都是各位作者付出辛苦劳动得来的,请尊重coser版权。2.图片自己下载使用可以,请勿用于商业用途,转载请先取…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

写在前面

前段时间实习结束回来休息,某日闲逛无意间又打开了半次元,突然看见几个好漂亮的coser小姐姐,就想存个图片当壁纸(づ ̄3 ̄)づ╭❤~

然而又发现,很多小姐姐都设置了作品禁止保存或者是右下角带水印

779aa738bce4

身为一个重度强迫症患者,默默打开浏览器,看看能不能偷鸡扒到原图。。。

开始之前

math?formula=%5Ccolor%7B%23FF0000%7D%7B%E6%9C%AC%E6%96%87%E6%97%A8%E5%9C%A8%E5%AD%A6%E4%B9%A0%E4%BA%A4%E6%B5%81%EF%BC%8C%E5%B8%8C%E6%9C%9B%E6%89%80%E6%9C%89%E9%98%85%E8%AF%BB%E7%9A%84%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E6%B8%85%E6%A5%9A%E4%BB%A5%E4%B8%8B%E5%87%A0%E7%82%B9%EF%BC%9A%7D

1. 所有图片都是各位作者付出辛苦劳动得来的,请尊重coser版权。

2. 图片自己下载使用可以,请勿用于商业用途,转载请先取得作者的同意并注明cn及链接。

3. 文末附有源码地址,但代码里我留了几个空白需要小伙伴们自己操作填写,拒绝伸手党。

下载原图的思路

采用爬虫的思路,将网页html文本中的图片链接提取出来,就能很方便地进行批量下载。

Step 1:浏览器控制台分析html,找到原图链接

这里以喵老师的作品为例,她的半次元主页:Misa贞喵

F12或右键审查元素,进入浏览器控制台,选择Element

779aa738bce4

然后不断打开html元素,找到图片所在的元素块。一般图片文件都在***里。

779aa738bce4

Step 2:Java+PhantomJs获取html文本,提取原图url

由于半次元网站采用了Ajax技术异步加载图片等内容,所以不能用传统的爬虫方法,那样是无法获取到图片链接的。

为了加载Ajax网页,正统的方法是分析页面js脚本中的http请求,然后通过请求得到数据文件。这里我偷了个懒,通过PhantomJs模拟浏览器访问网站得到Ajax加载后的页面。

(也许有人觉得这就不算爬虫了,无所谓啦,我只是想存个图。不过后面也会提到用PhantomJs的缺点)

通过上面文章的方法,就能成功获取的喵老师这篇作品的html文本了。

779aa738bce4

然后,或是通过正则或是通过其他插件,将url链接提取出来即可。这里我用了org.apache.commons.lang3包中的StringUtils这个工具进行字符串分析截取。

这里有它的官方jar包下载地址。

public String[] getAlbumNoteInfo(String html) {

String article = StringUtils.substringBetween(html, “”, “”);

String content = StringUtils.substringBetween(article, “class=\”inner-container\””, “class=\”declaration\””);

String[] strings = StringUtils.substringsBetween(content, “src=\””,”/w650\””);

return strings;

}

如此,该页面的图片url就都能提取出来了。

779aa738bce4

Step 3:根据url批量下载图片

这里也不用多说,直接用Java写个循环下载文件即可。嫌速度慢也可根据电脑性能及网速开多线程提高效率。

/**

* 下载图片

*/

public void downloadImg(String imgUrl, String filePath) {

String fileName = imgUrl.substring(imgUrl.lastIndexOf(“/”));

// 创建文件的目录结构

File files = new File(filePath);

if(!files.exists()){// 判断文件夹是否存在,如果不存在就创建一个文件夹

files.mkdirs();

}

try {

URL url = new URL(imgUrl);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

InputStream is = connection.getInputStream();

// 创建文件

File file = new File(filePath + “//” + fileName);

FileOutputStream out = new FileOutputStream(file);

int i = 0;

while((i = is.read()) != -1){

out.write(i);

}

is.close();

out.close();

} catch (Exception e) {

e.printStackTrace();

}

System.out.println(“下载完成:” + fileName);

}

成果

本来挺简单的东西没想着写多少,结果迫于懒癌晚期+强迫症。。。从几十行代码不断扩展,慢慢地写成了一个demo。。。

779aa738bce4

代码、作品及信息

然后就是下了一堆图。。。

779aa738bce4

罪过罪过

结语

写了几天代码,算是完成了一个半成品demo。

代码目前可以根据作者主页链接,开多线程下载该作者的全部图片作品,并提取作者&作品的相关信息写入文件,能够下载作者头像,将作品分文件夹存储,方便查看展示。同时作者有更新的话,再次下载该作者作品会检查信息,只下载更新的作品。一次操作,全部解决,我懒我任性。

该项目 源码地址:https://github.com/JohnnyJYWu/bcy-webcrawler-Java

代码不可直接运行,需要手动添加部分信息,如存储地址及url链接等。

具体 使用方法 及 展示效果 请阅读 README。

几个注意的地方:

这是一篇Java爬虫的文章,仅供交流。再次强调对各位coser及其作品版权的尊重,请勿用于商业用途。转载请取得作者同意并注明链接!

很多coser上传的都是原图,每张图片几MB或者十几MB都很正常,因此下载速度变慢也不稀奇。

相比而言,用PhantomJs来取Ajax页面确实存在很多不稳定因素,速度也很慢。后续也许会考虑分析一下js的http请求来获取数据,以及爬取更多资源如视频之类的。

前端网站的迭代更新会很快,可能过段时间半次元改前端了爬虫就会失效。所以本文及我的GitHub项目旨在提供一个解决方法,不保证能长期使用。

如果有任何问题可在评论留言,或在GitHub发布issue,我会尽量及时查看回复。

希望这篇文章对你有帮助~

第一次写博,有不足之处欢迎各位大佬批评指正。

我的GitHub:https://github.com/JohnnyJYWu

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193910.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Linux集群分发脚本xsync[通俗易懂]

    Linux集群分发脚本xsync[通俗易懂]Linux集群分发脚本xsync1.scp(securecopy)安全拷贝2.rsync远程同步工具3.xsync集群分发脚本4.免密登陆1.scp(securecopy)安全拷贝1)scp定义:scp可以实现服务器与服务器之间的数据拷贝(fromserver1toserver2)2)基本语法scp-r$pdir/$fname…

  • Win10 下报错 WerFault.exe -解决方法亲测有效

    Win10 下报错 WerFault.exe -解决方法亲测有效Win10WerFault.exe错误装了后经常出现WerFault.exe的应用程序错误提示。内存*****地址不能为read.解决方法两种:1.系统设置2.管理员运行cmd命令行模式我机器用的第二种方式。1.系统设置1.1本地组策略gpedit.msc用户配置-管理模块-Windows组件-Windows错误报告-禁用1.2…

  • redis分布式锁的应用场景_redis为什么可以做分布式锁

    redis分布式锁的应用场景_redis为什么可以做分布式锁“分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种。具体到业务场景中,我们要考虑二种情况:一、抢不到锁的请求,允许丢弃(即:忽略)比如:一些不是很重要的场景,比如“监控数据持续上报”,某一篇文章的“已读/未读”标识位更新,对于同一个id,如果并发的请求同时到达,只要有一个请求处理成功,就算成功。用活动图表示如下:二、并发请求,不论哪一条都必须要处理的场景(即:不允许丢数据)比如:一个订单,客户正在前台修改地址,.

  • VLDB论文解读:阿里云超大规模实时分析型数据库AnalyticDB「建议收藏」

    VLDB论文解读:阿里云超大规模实时分析型数据库AnalyticDB「建议收藏」1、背景随着数据量的快速增长,越来越多的企业迎来业务数据化时代,数据成为了最重要的生产资料和业务升级依据。伴随着业务对海量数据实时分析的需求越来越多,数据分析技术这两年也迎来了一些新的挑战和变革:在线化和高可用、离线和在线的边界越来越模糊,一切数据皆服务化、一切分析皆在线化; 高并发低延时,越来越多的数据系统直接服务终端客户,对系统的并发和处理延时提出了新的交互性挑战; 混合负载,一套实时分析系统既要支持数据加工处理,又要支持高并发低延时的交互式查询; 融合分析,随着对数据新的使用方式探索,需

  • qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)…「建议收藏」

    qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)…「建议收藏」简述对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态。而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结。分为下面六种不同情况客户端网线断开客户端网络断开客户端通过HTTP代理连接服务器,代理机器断开代理客户端通过HTTP代理连接服务器,代理机器的网络断开客户端通过HTTP代理连接服务器,代理机器的网线断开服务器断开同时对于以上六种情况又分为连接服务器之…

  • java菜鸟教程+视频笔记

    java菜鸟教程+视频笔记1、java中局部变量是在栈上分配的;2、数组是储存在堆上的对象,可以保存多个同类型变量;3、在Java语言中,所有的变量在使用前必须声明。4、局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。5、内置类型有默认值,引用对象的默认值是null;6、非静态实例变量、非静态方法是通过对象实例进行调用的,不能直接从静态方法中调用;比如java源文件中main方法中不可以直接调用非静态…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号