Jsoup 借用彼岸大图壁纸

前言

此处是我学习爬虫的一个小Demo,我愿意把我的技术和大家一起分享,如果哪里有什么不对的,还请评论告知。因为我是第一次使用Java技术栈来做爬虫,可能有些代码不够友好,请多担待。

因彼岸高清图片需要会员,本案例准备爬取大图,而不是缩略图。

(如有涉嫌侵犯网站的利益,请与我沟通)

引入 Maven 坐标

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version>
</dependency>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version>
</dependency>
<!-- 文件下载 -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version>
</dependency>

初始化成员属性

静态代码块 作用于将 目标地址 放到 页面集合 中。

首页 作用:用于后面对图片以及下一页地址的前缀拼接。

 // 首页地址
private static String homeUrl = "http://pic.netbian.com";
// 需要爬取的目标地址
private static String targetUrl = "http://pic.netbian.com/4kdongman";
// 存储每页的地址
private static List<String> pageUrls = Collections.synchronizedList(new ArrayList<>());static {pageUrls.add(targetUrl);
}

开始爬虫

使用 普通循环 的作用是为了在边遍历的时候边添加 url 进 页面集合。

使用 Jsoup 解析网页,获取网页源代码。

  1. 获取网页源代码
  2. 获取本页所有图片
  3. 将图片持久化到本地
  4. 获取下一页放入页面集合中
/*** @Description: 开启爬虫* Aauther: liucong* @date: 2020/8/24 9:27* @return:*/
private void start() {System.out.println("开始下载...");try {for (int i = 0; i < pageUrls.size(); i++) {System.out.println("正在下载第" + (i + 1) + "页图片...");// 获取每页的网页源代码Document doc = Jsoup.connect(pageUrls.get(i)).get();// 获取当前页的所有图片urlList<String> imgUrls = getImgUrls(doc);// 将当前页的图片保存到本地saveImg(imgUrls, i + 1);// 获取下一页saveNextUrl(doc);}} catch (IOException e) {e.printStackTrace();}
}

获取每页的大图网页

此处要注意一点,li 下面的 img 不是我们想要的图片,此处是缩略图;

我们需要的是 li 下面 a 链接跳转后页面的大图。

select 作用是查找到该选择器选择的标签集合;

attr 作用是获取该标签的某个属性。

/*** @Description: 获取每页的图片url* @auther: liucong* @date: 2020/8/24 9:27* @return:*/private List<String> getImgUrls(Document doc) {List<String> imgList = new ArrayList<>();// 每张图片的对应liElements lis = doc.select(".slist").select("ul").select("li");lis.forEach(li -> {// href 是一个网址地址,跳转到大图的页面String href = homeUrl + li.select("a").attr("href");String imgUrl = getImgUrlByHref(href);imgList.add(imgUrl);});return imgList;}

网页源代码:

获取大图的url

大图网页是一个新的网页,需要 Jsoup 再次进行解析。

/*** @Description: 根据href获取大图* @auther: liucong* @date: 2020/8/24 9:38* @return:*/
private String getImgUrlByHref(String href) {String src = "";try {Document doc = Jsoup.connect(href).get();src = homeUrl + doc.select(".photo-pic").select("a").select("img").attr("src");} catch (IOException e) {e.printStackTrace();}return src;
}

保存图片

try() {} 格式里,小括号里定义的流不管有没有异常,都会自动结束流。

/*** @Description: 将图片持久化到本地* @auther: liucong* @date: 2020/8/24 9:28* @return:*/
private void saveImg(List<String> urls, int page) {urls.forEach(url -> {// 用时间戳来动态设置文件名String fileUrl = String.format("C:\\笔记\\%d\\img%d.jpg", page, new Date().getTime());CloseableHttpClient httpclient = HttpClients.createDefault();// 创建httpclient实例// 创建httpget实例HttpGet httpget = new HttpGet(url);try (CloseableHttpResponse resp = httpclient.execute(httpget);InputStream inputStream = resp.getEntity().getContent()) {// 持久化到本地FileUtils.copyToFile(inputStream, new File(fileUrl));} catch (IOException e) {e.printStackTrace();}});
}

获取下一页url

使用 StringBuilder 的作用是:Lambda 表达式引用外面的对象,不能改变其地址,但是我们可以将数据存进对象。

/*** @Description: 获取当前页的下一页url,并存进集合* @auther: liucong* @date: 2020/8/24 10:09* @return:*/private void saveNextUrl(Document doc) {StringBuilder sb = new StringBuilder();Elements elements = doc.select(".page").select("a");elements.forEach(element -> {if (StringUtils.equals("下一页", element.text())) {String href = element.attr("href");sb.append(homeUrl + href);}});// 获取到下一页数据String next = sb.toString();if (!pageUrls.contains(next)) {if (!StringUtils.isEmpty(next)) {pageUrls.add(next);} else {System.out.println("完成下载...");}}}

完整代码

/*** @author liucong* @ClassName: ImgReptile* @Description:* @date: 2020/8/24 9:13*/
public class ImgReptile {// 首页地址private static String homeUrl = "http://pic.netbian.com";// 需要爬取的目标地址private static String targetUrl = "http://pic.netbian.com/4kdongman";// 存储每页的地址private static List<String> pageUrls = Collections.synchronizedList(new ArrayList<>());static {pageUrls.add(targetUrl);}/*** @Description: 开启爬虫* @auther: liucong* @date: 2020/8/24 9:27* @return:*/private void start() {System.out.println("开始下载...");try {for (int i = 0; i < pageUrls.size(); i++) {System.out.println("正在下载第" + (i + 1) + "页图片...");// 获取每页的网页源代码Document doc = Jsoup.connect(pageUrls.get(i)).get();// 获取当前页的所有图片urlList<String> imgUrls = getImgUrls(doc);// 将当前页的图片保存到本地saveImg(imgUrls, i + 1);// 获取下一页saveNextUrl(doc);}} catch (IOException e) {e.printStackTrace();}}/*** @Description: 获取每页的图片url* @auther: liucong* @date: 2020/8/24 9:27* @return:*/private List<String> getImgUrls(Document doc) {List<String> imgList = new ArrayList<>();// 每张图片的对应liElements lis = doc.select(".slist").select("ul").select("li");lis.forEach(li -> {// href 是一个网址地址,跳转到大图的页面String href = homeUrl + li.select("a").attr("href");String imgUrl = getImgUrlByHref(href);imgList.add(imgUrl);});return imgList;}/*** @Description: 根据href获取大图* @auther: liucong* @date: 2020/8/24 9:38* @return:*/private String getImgUrlByHref(String href) {String src = "";try {Document doc = Jsoup.connect(href).get();src = homeUrl + doc.select(".photo-pic").select("a").select("img").attr("src");} catch (IOException e) {e.printStackTrace();}return src;}/*** @Description: 获取当前页的下一页url,并存进集合* @auther: liucong* @date: 2020/8/24 10:09* @return:*/private void saveNextUrl(Document doc) {StringBuilder sb = new StringBuilder();Elements elements = doc.select(".page").select("a");elements.forEach(element -> {if (StringUtils.equals("下一页", element.text())) {String href = element.attr("href");sb.append(homeUrl + href);}});// 获取到下一页数据String next = sb.toString();if (!pageUrls.contains(next)) {if (!StringUtils.isEmpty(next)) {pageUrls.add(next);} else {System.out.println("完成下载...");}}}/*** @Description: 将图片持久化到本地* @auther: liucong* @date: 2020/8/24 9:28* @return:*/private void saveImg(List<String> urls, int page) {urls.forEach(url -> {// 用时间戳来动态设置文件名String fileUrl = String.format("C:\\笔记\\%d\\img%d.jpg", page, new Date().getTime());CloseableHttpClient httpclient = HttpClients.createDefault();// 创建httpclient实例// 创建httpget实例HttpGet httpget = new HttpGet(url);try (CloseableHttpResponse resp = httpclient.execute(httpget);InputStream inputStream = resp.getEntity().getContent()) {// 持久化到本地FileUtils.copyToFile(inputStream, new File(fileUrl));} catch (IOException e) {e.printStackTrace();}});}/*** @Description: 测试下载(入口函数)* @auther: liucong* @date: 2020/8/24 10:19* @return:*/@Testpublic void test() {start();}
}

学到的知识

  1. Jsoup链式 获取标签不如 xpath 简洁,但是阅读性不错;
  2. Lambda 表达式引用外面的基本数据类型,其值不能改变;
  3. Lambda 表达式引用外面的对象,不能改变其地址指向,但是可以操作里面数据;
  4. try(创建流){} catch 处理关闭流在 JDK1.8 之后进行了优化,小括号里定义的流会自动关闭。

Jsoup 借用彼岸大图壁纸相关推荐

  1. Strawberry Wallpaper:海量5K高清大图壁纸下载工具

    Strawberry Wallpaper 中文版又称草莓壁纸是一款类似于Mac上的Pap.er软件,可以为用户提供海量高清大图壁纸,支持壁纸下载,支持paper.500px.pexels 三大图库,让 ...

  2. 有没有关于python的壁纸_python获取彼岸所有壁纸

    第一部分代码 import requests from bs4 import BeautifulSoup import os import time import random import User ...

  3. Python爬虫爬取彼岸图库壁纸(requests+re+os 模块的简单运用)

    目标网址:http://pic.netbian.com/ 该壁纸网站免费,打赏30元可以获得永久VIP下载全站无损壁纸(反正我是没试过,各位有钱的大佬可以试试),此次目的只是获取有损大图 下载保存目录 ...

  4. Java爬虫---实战案例(爬取彼岸桌面壁纸)

    目录 步骤一:创建项目 步骤二:网页分析 1.在缩略图页面获取到详情页的超链接 2.在详情页页面获取到图片的下载地址 步骤三:图片下载 翻页功能 源代码 平时玩的爬虫都是用python写的,今天突发奇 ...

  5. Python爬虫新手入门教学(十):爬取彼岸4K超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  6. 游戏迷必备桌面|穿越火线壁纸,燃动少年心

    作为个cfer,收藏一下经典的cf图片是有必要的.cf手游刚上线的零妹妹可能让不少玩家垂涎已久,而网络上很多图片都带上码或者网站logo,在高图网 www.gaopic.com 高清壁纸让你不必费心搜 ...

  7. Android利用jsoup爬虫爬网页数据(二)

    效果图太大了,我放到github上了,想看效果的点击以下链接: 效果图一 效果图二 效果图和上文是一样的,上文只是说了一下简单的,这里的稍微麻烦一点,因为上文的基本就是个列表,而且数据结构比较简单,这 ...

  8. 爬虫36计之1.1 爬取高清MM图片壁纸

    文章目录 爬取彼岸花免费壁纸 主页分析 爬取主页信息 详细页面分析 爬取详细页面 爬取彼岸花免费壁纸 技术服务于生活,今天爬虫开篇就为广大的程序猿谋福利,爬取mm图片. 为什么要选择彼岸花为案例?因为 ...

  9. wlop一张多少钱_为什么很多人都对wlop有成见?

    说起来,真正出问题的不是wlop,而是他的一些脑残粉太让人难以忍受,才导致wlop招黑的. 一开始wlop定位的只是一个业余爱好者,把自己的小说画成漫画就完事了.结果因为表现手法和cg插画一个观感,就 ...

最新文章

  1. MySQL 唯一索引 UNIQUE KEY 会导致死锁?
  2. Ora_Excel 碉堡了
  3. java规则计算_java实现的霍纳规则的多项式计算
  4. mysql8.0client_navicat 连接mysql8.0 报错client does not support authentication
  5. dede服务器建站_建站就是这么简单(内容系统管理CMS篇)
  6. JBPM学习(一):实现一个简单的工作流例子全过程
  7. 阿里最新php面试题及答案,面经网-阿里php面试题(四)
  8. GATK之VariantAnnotator
  9. Access“INSERT INTO 语句的语法错误”解决办法
  10. Java JDBC初步
  11. 通用 CRUD 接口
  12. Java二维码的制作
  13. binlog的基本介绍和操作
  14. SQLserver基础语句大全
  15. cad边长提取lisp_用lisp怎么提取cad中文字-内容-*通用符匹配(值 :设定)生成excel文件...
  16. 关于MDI文件与Microsoft Office Document Imaging
  17. centos7下载安装postgresql 12详细过程
  18. 计算广告——搜索广告技术初窥
  19. [AI达人特训营第三期] 使用Lora技术用Dreambooth训练国潮风格模型
  20. 从业4-证券投资基金的监管

热门文章

  1. ZZNUOJ_用C语言编写程序实现1507:颠倒的数字(附完整源码)
  2. 【小小帝国】部分攻略
  3. 企业数字化转型:因企制宜,久久为功
  4. 红帽杯2021 Misc
  5. 几款最主流的音乐播放器应用源码-android源码
  6. 医学影像分割系统综述Data preparation for artificial intelligence in medical imaging: A comprehensive guide ...
  7. 使用MHDD修护硬盘坏道教程(2)
  8. tableau如何生成HTML文件,用Tableau快速制作网络关系图
  9. MySQL 在Linux下定时备份数据库
  10. 上学时咱们老班的搞笑语录。