项目 | Java+PhantomJs爬虫实战——半次元 下载高清原图

写在前面

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

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

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


开始之前

本 文 旨 在 学 习 交 流 , 希 望 所 有 阅 读 的 小 伙 伴 们 清 楚 以 下 几 点 : \color{#FF0000}{本文旨在学习交流,希望所有阅读的小伙伴们清楚以下几点:}
1. 所有图片都是各位作者付出辛苦劳动得来的,请尊重coser版权。
2. 图片自己下载使用可以,请勿用于商业用途,转载请先取得作者的同意并注明cn及链接。
3. 文末附有源码地址,但代码里我留了几个空白需要小伙伴们自己操作填写,拒绝伸手党。


下载原图的思路

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

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

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

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

  • 为了加载Ajax网页,正统的方法是分析页面js脚本中的http请求,然后通过请求得到数据文件。这里我偷了个懒,通过PhantomJs模拟浏览器访问网站得到Ajax加载后的页面。
    (也许有人觉得这就不算爬虫了,无所谓啦,我只是想存个图。不过后面也会提到用PhantomJs的缺点)

  • Java+PhantomJs的使用方法请参考我的这篇文章:
    项目 | Java获取Ajax页面(半次元)—— PhantomJS实现(带cookie登录)

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

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

public String[] getAlbumNoteInfo(String html) {
		String article = StringUtils.substringBetween(html, "<article>", "</article>");
		String content = StringUtils.substringBetween(article, "class=\"inner-container\"", "class=\"declaration\"");
		String[] strings = StringUtils.substringsBetween(content, "src=\"","/w650\"");
		return strings;
}
  • 如此,该页面的图片url就都能提取出来了。

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。。。
代码、作品及信息
然后就是下了一堆图。。。
罪过罪过


结语

写了几天代码,算是完成了一个半成品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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值