因为本人对爬虫比较感兴趣,加上之前也写过一些简单的python爬虫,所以在学完java基础后写了一个简单的网络图片爬虫。废话不多说直接上过程代码。(爬取的图源来自花瓣网:https://huaban.com/boards/favorite/beauty/)

源url页面分析

拿到爬取的源url,首先是分析页面哪些东西是要爬取的,这个页面是美女分类的画板页面,这里我们要爬的就是要爬取某个画板下面的所有图片。这里为了简单爬取我就选取了该页面推荐的几个画板。查看本页面源码可以很快找到推荐画板的url资源,如下图。

可以看到要爬取目标资源就存在这个app.page["suggests"]里面,可以通过正则拿到这些url,然后依次去访问这些url,得到画板页面。

画板url的爬取

这里先写一个静态的获取页面html的方法

public static StringBuffer getHtml(String url) throws Exception{URL url1 = new URL(url);URLConnection connection = url1.openConnection();InputStream is = connection.getInputStream();BufferedReader bw = new BufferedReader(new InputStreamReader(is));StringBuffer sb = new StringBuffer();while (bw.ready()){sb.append(bw.readLine()).append("\n");}bw.close();is.close();return sb;}

编写爬取画板url的正则,如下

tring suggestsRegex = "app.page\\[\"suggests\"\\] = \\{.*\\}";String urlRegex = "\"url\":\".*?\"";StringBuffer html = Util.getHtml("https://huaban.com/boards/favorite/beauty/");Matcher suggestsMatcher = Pattern.compile(suggestsRegex).matcher(html);while (suggestsMatcher.find()){Matcher urlMatcher = Pattern.compile(urlRegex).matcher(suggestsMatcher.group());while (urlMatcher.find()){System.out.println(urlMatcher.group());}}

可以得到下面的结果:

但是这些url并不全是我们需要的画板url,比如上面第三条url会跳转到另一个分类页面,而且有些url协议为http有些为https,这里测试发现协议为http的都会重定向到其对应的https页面,所以这里我们为了方便提取url,只提取目标中的画板id,就是数字部分,然后手动添加其余的部分,修改上面的部分代码如下。

while (urlMatcher.find()) {
//                System.out.println(urlMatcher.group());String urlStr = urlMatcher.group();if (urlStr.contains("boards")) {Matcher matcherId = Pattern.compile("[\\d]+").matcher(urlStr);String id = "";while (matcherId.find()) {id = matcherId.group();}String url = "https://huaban.com/boards/" + id;System.out.println(url);}}

此时就得到了推荐画板的url了。

画板页面分析

这里用getHtml方法得到的画板页面html和在浏览器中查看的源码并不相同,其中源码部分的script代码被解析为了html代码被返回回来了。所以这里我们只能看控制台打印回来的代码来找到图片的url。此处就不作太多介绍,具体可自行尝试查看。

图片url的爬取

这里也是采用正则来爬(网上有选择器的方法来爬取目标资源,可自行百度),先是获取所有img标签的内容再进一步正则查询其中符合图片url特征的内容。如下

String  get_img_regex = "<img src=\"//hbimg.*?/>";String  get_src_regex = "\"//hbimg.huabanimg.com/.*?\"";StringBuffer html = Util.getHtml("https://huaban.com/boards/17375733");Matcher matcherImg = Pattern.compile(get_img_regex).matcher(html);while (matcherImg.find()){Matcher matcherSrc = Pattern.compile(get_src_regex).matcher(matcherImg.group());while (matcherSrc.find()){System.out.println(matcherSrc.group());}}

通过测试发现末尾位sq75sf的是头像图url,末尾为fw236的才是我们需要的图片url,不过是小图,我们发现大图(浏览器上点开单个图片页面即可查看大图url)的url只有末尾参数与小图url不同(大图末尾是fw658),修改上面部分代码如下

while (matcherSrc.find()){String srcStr = matcherSrc.group();if (srcStr.contains("fw236")){String srcUrl = srcStr.substring(1,srcStr.length()-1).replace("fw236","fw658");System.out.println(srcUrl);}}

最后将得到的数据用列表封装并返回即可。

图片下载

URL url = new URL("http://hbimg.huabanimg.com/3bd402c57a727148fce86c193c9d5e93fb48b14b4d760-wF9Y7Z_fw658");InputStream is = url.openStream();FileOutputStream fos = new FileOutputStream("src/test.png");byte buf[] = new byte[1024];int length = 0;while ((length=is.read(buf))!=-1){fos.write(buf,0,length);}fos.close();is.close();

代码优化与完善

这里简单的说一下程序优化的方案。由于有多个画板,所以每个画板可以开启一个线程进行爬取。还有就是每个画板大约只能爬到40张左右图片,那是因为页面采用Ajax加载资源(这个我也不太懂,可自行百度),可用代码模拟加载数据进而获取到所有图片。(这里每次加载请求的参数是每个页面最后一张图片的id,可自行尝试完成)

写在最后

因为本人还是个java初学者菜鸟,所以代码肯定是有漏洞和不足的地方欢迎大家指出共同学习,谢谢。

项目源码:https://github.com/zengtao614/JavaCrawler

转载于:https://www.cnblogs.com/zengtao614/p/10826448.html

java的简单网络爬虫(爬取花瓣网的图片)相关推荐

  1. 用python网络爬虫爬取英雄联盟英雄图片

    用python爬虫爬取lol皮肤. 这也用python网络爬虫爬取lol英雄皮肤,忘了是看哪个大神的博客(由于当时学了下就一直放在这儿,现在又才拿出来,再加上马上要考二级挺忙的.),代码基本上是没改, ...

  2. 用Python写一个网络爬虫爬取网页中的图片

    写一个爬虫爬取百度贴吧中一个帖子图片 网址:壁纸 用谷歌浏览器的开发工具检查网页,可以发现其每一张图片都有如下格式 <img class="BDE_Image" src=&q ...

  3. 一、网络爬虫----爬取豆瓣网前250条数据

    一.爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应 获取响应内容 如果服务器能正常响应,会得到一个Res ...

  4. 网络爬虫爬取某网数据并制作词云全过程【内附可执行代码注释完整】

    文章目录 前言 网络爬取数据部分 小知识点 利用正则表达式在字符串中提取到url(https以及http) 仅仅只保存字符串中的中文字符 爬取数据 生成词云 jieba分词 生成词云 生成词云最终版代 ...

  5. C#编写网络爬虫爬取网页流和图片

    最近开始学一下c#编写爬虫,发现了一个很好的视频资源,然后就在学习之余,做一些笔记. 视频资源链接:https://www.bilibili.com/video/av11424797/?spm_id_ ...

  6. 跟潭州学院的强子老师学习网络爬虫---爬取全书网

    真是太白了,python之路还有很长,今天我从这里开始,留作自己备忘.2018-04-05 花了一个下午学习个爬小说的,总的来说是因为自己没什么基础,哪里不会补哪里,磕磕绊绊的,总算是能运行,先把代码 ...

  7. java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息

    [Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...

  8. python网络爬虫——爬取嗅事百科

    网络爬虫 - 爬取嗅事百科 爬取过程分三大步: 一,请求,获取网页源码 url为:url =' https : //www.qiushibaike.com/8hr/page/'+ str(page)先 ...

  9. 网络爬虫爬取拉勾招聘网

    网络爬虫爬取拉勾招聘网 搭配好环境 复制以下代码 # -*- coding: utf-8 -*- """ Created on Mon Sep 7 21:44:39 20 ...

最新文章

  1. GNN综述:从deepwalk到GraphSAGE,GCN,GAT
  2. zookeeper代码浅析
  3. JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧
  4. mysql主从不同步 tar_Mysql主从不同步问题处理案例
  5. 字符串:你看的懂的KMP算法(带验证)
  6. 用vue开发顶端粘滞效果的页面
  7. 线程、线程与进程、ULT与KLT
  8. 摘录一些介绍Linux DKMS的博客文章
  9. 官版树莓派Pi Pico和YD-RP2040版本对比
  10. 北醒TF雷达在飞控F4 上的应用
  11. 假如某人年薪100万,如何分配月发和年终奖会使其纳税金额最少
  12. 安利几款超好用,不容错过的APP
  13. Scrapy图片分类异步下载
  14. 面向过程与面向对象有什么区别
  15. sql中的模糊查询及字段前加N的作用
  16. OSG 加载 fbx模型 渲染 已解决
  17. 结对编程心得---------优秀的队友是成功的一半
  18. Nachos系统简介
  19. 华为云计算名词讲解(学习记录中)
  20. C++模板的底层实现

热门文章

  1. 运营商大数据系列(一) LTE信令数据简析
  2. java虚拟机中参数的使用和具体介绍
  3. java swing action_Swing ActionListener接口
  4. 计算机考试可以第二天考吗,计算机二级考试时间内每天都可以考吗
  5. 索尼神话破灭:急功近利 丧失激情 挑战精神消失 创新能力衰退
  6. windows的系统还原
  7. 推荐一位好友,是他让我破了戒!
  8. 2020 国家知识产权战略试题答案
  9. 它广泛用于保护 C/S 、B/S 通信安全,大多数人却不知道如何管理配置它
  10. i5 1335U参数 i5 1335U性能怎么样 酷睿i51335U相当于什么水平