Java实现爬取百度图片的方法分析
作者:Joker_Ye 发布时间:2023-12-19 23:51:27
本文实例讲述了Java实现爬取百度图片的方法。分享给大家供大家参考,具体如下:
在以往用java来处理解析HTML文档或者片段时,我们通常会采用htmlparser(http://htmlparser.sourceforge.net/)这个开源类库。现在我们有了JSOUP,以后的处理HTML的内容只需要使用JSOUP就已经足够了,JSOUP有更快的更新,更方便的API等。
jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,可以看作是java版的jQuery。
jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。官方网站:http://jsoup.org/
步骤大致可以分为三个模块:一是获取网页的资源,二是解析获取的资源,取出我们想要的图片URL地址,三是通过java的io存储在本地文件中。
获取网页资源的核心模块就是通过Jsoup去获取网页的内容,具体核心代码如下:
private static List<JsoupImageVO> findImageNoURl(String hotelId, String url, int timeOut) {
List<JsoupImageVO> result = new ArrayList<JsoupImageVO>();
Document document = null;
try {
document = Jsoup.connect(url).data("query", "Java")//请求参数
.userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")//设置urer-agent get();
.timeout(timeOut)
.get();
String xmlSource = document.toString();
result = dealResult(xmlSource, hotelId);
} catch (Exception e) {
String defaultURL = "http://qnimg.zowoyoo.com/img/15463/1509533934407.jpg";
result = dealResult(defaultURL,hotelId);
}
return result;
}
其中URL地址是百度图片搜索的地址,具体调用代码如下:
public static List<JsoupImageVO> findImage(String hotelName, String hotelId, int page) {
int number=5;
String url = "http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=" + hotelName + "&cg=star&pn=" + page * 30 + "&rn="+number+"&itg=0&z=0&fr=&width=&height=&lm=-1&ic=0&s=0&st=-1&gsm=" + Integer.toHexString(page * 30);
int timeOut = 5000;
return findImageNoURl(hotelId, url, timeOut);
}
这里需要注意的是:word是我们要搜索的关键字,pn是显示的页码,rn是一页显示多少个数据。
解析网页的资源,然后封装起来。核心代码如下:
private static List<JsoupImageVO> dealResult(String xmlSource, String hotelId) {
List<JsoupImageVO> result = new ArrayList<JsoupImageVO>();
xmlSource = StringEscapeUtils.unescapeHtml3(xmlSource);
String reg = "objURL\":\"http://.+?\\.(gif|jpeg|png|jpg|bmp)";
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(xmlSource);
while (m.find()) {
JsoupImageVO jsoupImageVO = new JsoupImageVO();
String imageURL = m.group().substring(9);
if(imageURL==null || "".equals(imageURL)){
String defaultURL = "http://qnimg.zowoyoo.com/img/15463/1509533934407.jpg";
jsoupImageVO.setUrl(defaultURL);
}else{
jsoupImageVO.setUrl(imageURL);
}
jsoupImageVO.setName(hotelId);
result.add(jsoupImageVO);
}
return result;
}
这里最主要的地方就是reg这个正则表达式,通过正则表达式,去网页中解析符合规定的图片URL地址,然后封装在对象中。
最后一部分就是通过java的io流去图片地址获取图片,并保存在本地。核心代码如下:
//根据图片网络地址下载图片
public static void download(String url,String name,String path){
File file= null;
File dirFile=null;
FileOutputStream fos=null;
HttpURLConnection httpCon = null;
URLConnection con = null;
URL urlObj=null;
InputStream in =null;
byte[] size = new byte[1024];
int num=0;
try {
dirFile = new File(path);
if(dirFile.exists()){
dirFile.delete();
}
dirFile.mkdir();
file = new File(path+"//"+name+".jpg");
fos = new FileOutputStream(file);
if(url.startsWith("http")){
urlObj = new URL(url);
con = urlObj.openConnection();
httpCon =(HttpURLConnection) con;
in = httpCon.getInputStream();
while((num=in.read(size)) != -1){
for(int i=0;i<num;i++)
fos.write(size[i]);
}
}
}catch (FileNotFoundException notFoundE) {
LogUtils.writeLog("找不到该网络图片....");
}catch(NullPointerException nullPointerE){
LogUtils.writeLog("找不到该网络图片....");
}catch(IOException ioE){
LogUtils.writeLog("产生IO异常.....");
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里面的操作都是java中io篇一些基础的操作,有不懂的可以去看看java中io模块的内容。
因为我这边是maven项目,所以在开发前需要引入Jsoup依赖才可以。
源码可点击此处本站下载。
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/hj7jay/article/details/84335161
猜你喜欢
- launch我们经常用,今天来看看它是什么原理。建议: 食用本篇文章之前记得先食用Kotlin协程之createCoroutine和star
- 1.什么是PDF/UA文件PDF/UA,即Universally Accessible PDF,该格式的PDF文件是于2012年8月以ISO
- 基本结构我们先来看一段最基本的代码,分析这段代码在RxJava中是如何实现的。Observable.OnSubscribe<Strin
- 效果图示例结构图代码解析导入dataBinding dataBinding{ &nb
- 我们知道,Object类是所有类的父类,因此也被称为根类、祖先。那么,我们就来看一看Object类的最常用的两个方法是如何用的。1.toSt
- 1.将本地jar包放入本地仓库。只需执行如下命令即可:mvn install:install-file -Dfile=D:/demo/fib
- Java for循环标签跳转到指定位置大家是否见过这种for循环,在for循环前加了个标记的:outerLoop:for (; ; ) {
- 这个工具比较简单,用于配合另外一个工具进行文件传送,废话少说,上代码import java.net.URL;import java.net.
- 为什么使用logback记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是
- 在之前的章节中,我们都是假设程序中只有一条执行流,程序从main方法的第一条语句逐条执行直到结束。从本节开始,我们讨论并发,在程序中创建线程
- JOL简介JOL的全称是Java Object Layout。是一个用来分析JVM中Object布局的小工具。包括Object在内存中的占用
- 这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件。一、简介Add sleuth to
- 摘要:最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控件。一、遇到的问题获取全部任务
- 今天遇到了一个比较有意思的问题,从服务器上封装好的java.sql.timestamp对象返回到本地客户端程序后与数据库中的时间相差了整整1
- springboot扩展MVC自定义 config -> SpringMvcConfig.java下边就是扩展springMVC的模板
- 1. RocketMQ Topic创建机制以下源码基于Rocket MQ 4.7.0RocketMQ Topic创建机制分为两种:一种自动创
- GB2312是简体中文系统的标准编码 用“区” 跟“位”的概念表示 称之为区位码 区指代大的范围 位相当于偏移量。每个汉字占两个字节高位字节
- 承蒙各位厚爱,我们一起每天进步一点点!(鼠标选中空白处查看答案)1、以下不属于构造方法特征的是()正确答案: D构造方法名与类名相同构造方法
- 一对多查询一对多关联查询是指在查询一方对象的时候,同时将其所关联的多方对象也都查询出来。下面以班级 Classes 与学生 Student
- 本文实例为大家分享了C# Email发送邮件的具体代码,供大家参考,具体内容如下//回执地址 var Receipt = &q