目录

  • 步骤一:创建项目
  • 步骤二:网页分析
    • 1.在缩略图页面获取到详情页的超链接
    • 2.在详情页页面获取到图片的下载地址
  • 步骤三:图片下载
  • 翻页功能
  • 源代码

平时玩的爬虫都是用python写的,今天突发奇想的用java写了一个,整个分析的过程和使用python是一样的,都是一样的思路,唯一的区别可能就是语言的不同了,也就是命令和语法。废话不多说,直接进入正题,在此之前还是先贴一下效果图吧。

效果图:

壁纸下载地址:http://www.netbian.com/fengjing/

工具:IDEA

项目创建:Maven

步骤一:创建项目

这一步就不做过多的讲解了,如果有不太了解的地方,可以参考这篇文章:项目管理工具 Maven 的下载,安装,配置以及项目的创建和管理

这里只把项目中的pom.xml配置文件贴一下:

要注意的是配置文件中的依赖

步骤二:网页分析

在这个页面我们只能获取到缩略图片,没办法获取到大图,我们随便点开一个进入详情页

在这个页面我们已经可以获取到大图了

按"F12"打开检查,查看图片路径

打开这个url,我们可以看到这就是我们想要下载的图片


上面就是我们获取到图片的一个流程,那写代码的步骤是什么呢?

1.在缩略图页面获取到详情页的超链接
2.在详情页页面获取到图片的下载地址


1.在缩略图页面获取到详情页的超链接

如果直接获取a标签那肯定有很多是我们不需要的,所以我们用从外到内的方式进行获取,过滤掉其他不需要的a标签

代码部分:

将获取到的所有详情页的url存储到一个列表中,方便我们后续使用

//    获取a标签中的href属性值并将其存储到列表中public List<String> GetElementUrl(List<String> list){for(String url: list){try {//                需要导入Jsoup包String html = Jsoup.connect(url).execute().body();
//                解析源代码Document document = Jsoup.parse(html);
//                获取元素Elements elements = document.select("div[id=main]").select("div[class=list]").select("ul").select("li").select("a");
//                遍历所有元素for (int i = 0; i < elements.size(); i++){//                    获取a标签中href属性的值String aUrl = elements.get(i).attr("href");
//                    里面还是有我们不需要的,所以这里还要设置一个条件来进行过滤if(!aUrl.contains("https:")){//                        将属性值存储到列表中AUrlList.add(aUrl);}}} catch (Exception e) {e.printStackTrace();}}return AUrlList;}

2.在详情页页面获取到图片的下载地址

这就是图片的下载地址

获取这里的img标签和我们上一步获取a标签是一样的,我们还是采用从外到内的方式获取,以达到过滤的目的

代码部分:

把获取到的img标签中的src属性值存储到列表中,图片名称也存储到列表中

//    获取img标签中的src属性值,并将其存储到列表中public List<String> GetImageUrl(List<String> list){for (Object o : list) {//            将url补充完整try {URL aUrl = new URL("http://www.netbian.com" + (String) o);URLConnection conn = aUrl.openConnection();InputStream is=conn.getInputStream();
//                获取的源代码乱码,此处解决乱码问题BufferedReader br = new BufferedReader(new InputStreamReader(is,"gbk"));String html = null;String line = null;while((line = br.readLine()) != null){html = html + line;}Document document = Jsoup.parse(html);
//                获取img标签Elements elements = document.select("div[id=main]").select("div[class=endpage]").select("div[class=pic]").select("p").select("a").select("img");
//                获取img标签中的src属性值String ImageURL = elements.attr("src");
//                获取图片名String ImageName = elements.attr("title");
//                将图片src属性值存储到列表中ImageUrlList.add(ImageURL);
//                将图片名存入列表中ImageNameList.add(ImageName);} catch (Exception e) {e.printStackTrace();}}return ImageUrlList;}

解释一个地方

其实,上面的这部分代码(第一部分)

URL aUrl = new URL("http://www.netbian.com" + (String) o);
URLConnection conn = aUrl.openConnection();
InputStream is=conn.getInputStream();
//获取的源代码乱码,此处解决乱码问题
BufferedReader br = new BufferedReader(new InputStreamReader(is,"gbk"));
String html = null;
String line = null;
while((line = br.readLine()) != null){html = html + line;
}

等价于这部分代码(第二部分)

String html = Jsoup.connect("http://www.netbian.com" + (String) o).execute().body();

那为什么还要用代码多的那部分呢?

主要是因为这里涉及到乱码的问题,我们获取到的源代码会显示乱码,用第二部分代码获取源代码我还没有找到解决乱码的方法,所以只能用第一部分代码来获取源代码并且解决乱码的问题,如果大家有更简单的方法,可以写在评论区或者私信我,一定虚心请教。


步骤三:图片下载

单独定义一个用于下载的方法,只需要传入存储img标签src属性值的列表即可

代码部分:

//    下载图片public void DownLoadToLocal(List<String> list){int len;for (int i =0; i < list.size(); i++){try {//                创建url对象URL ImgUrl = new URL(list.get(i));URLConnection con = ImgUrl.openConnection();
//                创建输入流对象InputStream is = con.getInputStream();byte[] bs = new byte[1024];
//                图片名String ImgName = ImageNameList.get(i);
//                本地存储路径String LocalUrl = SaveUrl + ImgName + ".jpg";
//                创建文件对象File file = new File(LocalUrl);
//                创建输出流对象,当文件不存在时会自动创建,true表示追加写入FileOutputStream os = new FileOutputStream(file,true);
//                read()从输入流中读取下一个字节。如果没有字节可读(文件读取完成)返回-1while ((len = is.read(bs)) != -1){//                从字节数组bs中,将偏移量从0开始的len个字节写入此文件输出流os.write(bs,0,len);}System.out.println("图片  " + ImgName + "  下载成功");} catch (Exception e) {e.printStackTrace();}}}

翻页功能

这里我还定义了一个翻页的方法,原理很简单也很直观,因为每页的url我们可以直接看到,所以我们只需要按照规律使用字符串拼接拼凑出每页的url即可

第一页

第二页

第三页

一眼就看出规律了吧,所以只要按照这个规律去拼凑每页的url就可以了,从而实现翻页功能。

代码部分:

要注意的是第一页的url有点特殊,别忘了单独处理

//    指定下载页数public void DownLoadPage(int AllPage){String PageUrl;List<String> EleList = null;for(int i = 1; i <= AllPage; i++){if(i == 1){//                将第一页的url添加到列表中BaseUrlList.add(baseurl);}else {//                其他页的urlPageUrl = baseurl + "index_" + i + ".htm";
//                将其他页的url添加到列表中BaseUrlList.add(PageUrl);}}}

下面是源代码,感觉这篇文章有意思的话,还请多多支持呀,你们的支持是我创作的最大动力。


源代码

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;public class GetBackground {//    下载图片类别入口,输入所要下载类别的第一页的urlstatic String baseurl = "http://www.netbian.com/fengjing/";
//    本地存储路径static String SaveUrl = "D:/图片/";
//    存储不同下载页面的urlstatic List<String> BaseUrlList = new ArrayList<String>();
//    存储a标签中的urlstatic List<String> AUrlList = new ArrayList<String>();
//    存储img标签中的urlstatic List<String> ImageUrlList = new ArrayList<String>();
//    存储图片名称static List<String> ImageNameList = new ArrayList<String>();//    程序入口public static void main(String[] args) {GetBackground getBackground = new GetBackground();
//        System.out.println(EleList);getBackground.DownLoadPage(2);List<String> EleList = getBackground.GetElementUrl(BaseUrlList);List<String> ImgList = getBackground.GetImageUrl(EleList);getBackground.DownLoadToLocal(ImgList);}//    获取a标签中的href属性值并将其存储到列表中public List<String> GetElementUrl(List<String> list){for(String url: list){try {//                需要导入Jsoup包String html = Jsoup.connect(url).execute().body();
//                解析源代码Document document = Jsoup.parse(html);
//                获取元素Elements elements = document.select("div[id=main]").select("div[class=list]").select("ul").select("li").select("a");
//                遍历所有元素for (int i = 0; i < elements.size(); i++){//                    获取a标签中href属性的值String aUrl = elements.get(i).attr("href");
//                    里面还是有我们不需要的,所以这里还要设置一个条件来进行过滤if(!aUrl.contains("https:")){//                        将属性值存储到列表中AUrlList.add(aUrl);}}} catch (Exception e) {e.printStackTrace();}}return AUrlList;}//    获取img标签中的src属性值,并将其存储到列表中public List<String> GetImageUrl(List<String> list){for (Object o : list) {//            将url补充完整try {URL aUrl = new URL("http://www.netbian.com" + (String) o);URLConnection conn = aUrl.openConnection();InputStream is=conn.getInputStream();
//                获取的源代码乱码,此处解决乱码问题BufferedReader br = new BufferedReader(new InputStreamReader(is,"gbk"));String html = null;String line = null;while((line = br.readLine()) != null){html = html + line;}Document document = Jsoup.parse(html);
//                获取img标签Elements elements = document.select("div[id=main]").select("div[class=endpage]").select("div[class=pic]").select("p").select("a").select("img");
//                获取img标签中的src属性值String ImageURL = elements.attr("src");
//                获取图片名String ImageName = elements.attr("title");
//                将图片src属性值存储到列表中ImageUrlList.add(ImageURL);
//                将图片名存入列表中ImageNameList.add(ImageName);} catch (Exception e) {e.printStackTrace();}}return ImageUrlList;}//    下载图片public void DownLoadToLocal(List<String> list){int len;for (int i =0; i < list.size(); i++){try {//                创建url对象URL ImgUrl = new URL(list.get(i));URLConnection con = ImgUrl.openConnection();
//                创建输入流对象InputStream is = con.getInputStream();byte[] bs = new byte[1024];
//                图片名String ImgName = ImageNameList.get(i);
//                本地存储路径String LocalUrl = SaveUrl + ImgName + ".jpg";
//                创建文件对象File file = new File(LocalUrl);
//                创建输出流对象,当文件不存在时会自动创建,true表示追加写入FileOutputStream os = new FileOutputStream(file,true);
//                read()从输入流中读取下一个字节。如果没有字节可读(文件读取完成)返回-1while ((len = is.read(bs)) != -1){//                从字节数组bs中,将偏移量从0开始的len个字节写入此文件输出流os.write(bs,0,len);}System.out.println("图片  " + ImgName + "  下载成功");} catch (Exception e) {e.printStackTrace();}}}//    指定下载页数public void DownLoadPage(int AllPage){String PageUrl;List<String> EleList = null;for(int i = 1; i <= AllPage; i++){if(i == 1){//                将第一页的url添加到列表中BaseUrlList.add(baseurl);}else {//                其他页的urlPageUrl = baseurl + "index_" + i + ".htm";
//                将其他页的url添加到列表中BaseUrlList.add(PageUrl);}}}}

关注公众号,获取相关资料和更多有趣文章(有什么问题可以私信我)

Java爬虫---实战案例(爬取彼岸桌面壁纸)相关推荐

  1. 【Python爬虫实战】爬取彼岸图库高清图片

    利用Python爬取彼岸图库高清图片 让你每天一张壁纸不重样,今天利用Python爬取 彼岸图库 http://pic.netbian.com/ 分析网页 通过首页可以看到要获取全站图片必须先抓取各个 ...

  2. Java爬虫学习一一Jsoup爬取彼岸桌面分类下的图片

    最近在找工作,在这个过程中我感到很迷茫,投了很多简历,被查看的却很少,其中也有到现场去面试,结果也很不理想(╥╯^╰╥). 哈哈,跑题了,我在看之前所做的项目时,在我的收藏夹中看到了以前收藏的有关爬虫 ...

  3. python桌面爬虫_爬虫项目实战十三:爬取zol桌面壁纸

    目标 爬取zol桌面壁纸,批量下载图片. 项目准备 软件:Pycharm 第三方库:requests,fake_useragent,re,lxml 网站地址:http://desk.zol.com.c ...

  4. 运用python爬取彼岸桌面所有关键字高清壁纸

    运用python爬取彼岸桌面所有关键字高清壁纸 第一次在csdn写博客, 个人技术并不成熟, 还是学生, 高手轻喷菜鸡勿啄 就是心血来潮想要换桌面壁纸, 存在一个文件夹自动更换, 但是从网站上一个一个 ...

  5. 携程ajax,Python爬虫实战之爬取携程评论

    一.分析数据源 这里的数据源是指html网页?还是Aajx异步.对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍. 提示:以下操作均不需要登录(当然登录也可以) 咱们先在浏览器里面搜索携 ...

  6. Python爬虫实战之爬取糗事百科段子

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

  7. Python【爬虫实战】爬取美女壁纸资源

    Python[爬虫实战]爬取美女壁纸资源 一:首先选取一个网站,这里我们选择了一个壁纸网站 二:进入网站,我们可以看到很多图片放在一页里 三:按下F12开发者工具,点击Elments查看网页的代码 四 ...

  8. [day4]python网络爬虫实战:爬取美女写真图片(Scrapy版)

    l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.Scrapy简介 4. ...

  9. [day1]python网络爬虫实战:爬取美女写真图片

    l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.实现 1.分析url格 ...

最新文章

  1. SSH框架整合-慕课课程
  2. mysql 表中添加数据类型_MySQL数据表添加字段(三种方式)
  3. java数组详解_java数组详解
  4. 基本的Socket通信
  5. 洛谷P1217 回文质数
  6. Linux 中 VIM 的使用
  7. org.neo4j.kernel.StoreLockException: Store and its lock file has been locked by another process
  8. jmeter脚本增强
  9. Python如何运行.ipynb文件并将其转化为.py文件
  10. android 面向对象 5,C++基础学习笔记(5)---面向对象(测试题)
  11. 家用计算机选购,家用电脑该如何选择?什么配置比较好?看完这篇文章你就懂了...
  12. jp.ne.so_net.ga2.no_ji.jcom.JComException: createInstance() failed HRESULT=0x800401F3L
  13. Flutter 项目实战 应用图标启动页三
  14. 无线射频专题《射频合规,2.4GHz WIFI频谱模板》
  15. springboot系列课程笔记-第一章-Spring Boot入门
  16. 从乔布斯卸任看苹果未来三年 会否半途而废?
  17. 通过一个例子快速上手矩阵求导
  18. 【uni-app】uni-app实现聊天页面功能——功能篇(上)
  19. Java并发(一)并发基础
  20. 中心透视投影和鱼眼投影的区别(Central perspective projection vs. fisheye projection)

热门文章

  1. 从 Android 到 React Native 开发(四、打包流程解析和发布为 Maven 库 )
  2. 如何快速上手新项目?
  3. 烟台大学 计114-3.4 班学生的博客地址
  4. win10怎么设置外接摄像头_win10电脑外接摄像头怎么打开?
  5. E. Massage
  6. 私募证券基金常用业绩报酬计提介绍
  7. springboot 获取当前日期_Spring Boot获取时间
  8. OSCP靶场系列-Esay-BBSCute保姆级
  9. 计算机不能创建用户,Win10安全模式下无法创建新账户怎么办
  10. 【ChatGPT】对话体验