java的简单网络爬虫(爬取花瓣网的图片)
因为本人对爬虫比较感兴趣,加上之前也写过一些简单的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的简单网络爬虫(爬取花瓣网的图片)相关推荐
- 用python网络爬虫爬取英雄联盟英雄图片
用python爬虫爬取lol皮肤. 这也用python网络爬虫爬取lol英雄皮肤,忘了是看哪个大神的博客(由于当时学了下就一直放在这儿,现在又才拿出来,再加上马上要考二级挺忙的.),代码基本上是没改, ...
- 用Python写一个网络爬虫爬取网页中的图片
写一个爬虫爬取百度贴吧中一个帖子图片 网址:壁纸 用谷歌浏览器的开发工具检查网页,可以发现其每一张图片都有如下格式 <img class="BDE_Image" src=&q ...
- 一、网络爬虫----爬取豆瓣网前250条数据
一.爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应 获取响应内容 如果服务器能正常响应,会得到一个Res ...
- 网络爬虫爬取某网数据并制作词云全过程【内附可执行代码注释完整】
文章目录 前言 网络爬取数据部分 小知识点 利用正则表达式在字符串中提取到url(https以及http) 仅仅只保存字符串中的中文字符 爬取数据 生成词云 jieba分词 生成词云 生成词云最终版代 ...
- C#编写网络爬虫爬取网页流和图片
最近开始学一下c#编写爬虫,发现了一个很好的视频资源,然后就在学习之余,做一些笔记. 视频资源链接:https://www.bilibili.com/video/av11424797/?spm_id_ ...
- 跟潭州学院的强子老师学习网络爬虫---爬取全书网
真是太白了,python之路还有很长,今天我从这里开始,留作自己备忘.2018-04-05 花了一个下午学习个爬小说的,总的来说是因为自己没什么基础,哪里不会补哪里,磕磕绊绊的,总算是能运行,先把代码 ...
- java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息
[Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...
- python网络爬虫——爬取嗅事百科
网络爬虫 - 爬取嗅事百科 爬取过程分三大步: 一,请求,获取网页源码 url为:url =' https : //www.qiushibaike.com/8hr/page/'+ str(page)先 ...
- 网络爬虫爬取拉勾招聘网
网络爬虫爬取拉勾招聘网 搭配好环境 复制以下代码 # -*- coding: utf-8 -*- """ Created on Mon Sep 7 21:44:39 20 ...
最新文章
- GNN综述:从deepwalk到GraphSAGE,GCN,GAT
- zookeeper代码浅析
- JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧
- mysql主从不同步 tar_Mysql主从不同步问题处理案例
- 字符串:你看的懂的KMP算法(带验证)
- 用vue开发顶端粘滞效果的页面
- 线程、线程与进程、ULT与KLT
- 摘录一些介绍Linux DKMS的博客文章
- 官版树莓派Pi Pico和YD-RP2040版本对比
- 北醒TF雷达在飞控F4 上的应用
- 假如某人年薪100万,如何分配月发和年终奖会使其纳税金额最少
- 安利几款超好用,不容错过的APP
- Scrapy图片分类异步下载
- 面向过程与面向对象有什么区别
- sql中的模糊查询及字段前加N的作用
- OSG 加载 fbx模型 渲染 已解决
- 结对编程心得---------优秀的队友是成功的一半
- Nachos系统简介
- 华为云计算名词讲解(学习记录中)
- C++模板的底层实现