利用Jsoup扒取百度图片

因为业务的需求,需要去百度图片搜索中搜索相应的图片,但是得批量完成,因为人工搜索图片效率太低,所以只能通过扒取网页的形式,扒取图片。然后将图片存储在本地的文件下面。

下面我将用Jsoup来扒取百度图片,并通过java中io保存在本地文件中。

步骤大致可以分为三个模块:一是获取网页的资源,二是解析获取的资源,取出我们想要的图片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依赖才可以。

GitHub地址:https://github.com/1913045515/Jsoup/tree/master 大致的过程就是这样,如果对上面的内容还有什么疑义或者问题都可以加微信:qiang220316咨询

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏熊二哥

Java基础组件快速入门

最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜。现在手头的工作基本完成了,因此打算好好来归纳下j...

2136
来自专栏岑玉海

hbase源码系列(十三)缓存机制MemStore与Block Cache

这一章讲hbase的缓存机制,这里面涉及的内容也是比较多,呵呵,我理解中的缓存是保存在内存中的特定的便于检索的数据结构就是缓存。 之前在讲put的时候,put是...

3387
来自专栏风中追风

redis 实现分布式锁的演进

比如说:每分钟要执行关闭未支付订单的定时任务,在集群的环境下,如果不做处理,每台服务器都会去执行这个定时任务,显然每个时间段的定时任务只需要执行一次,并不需要每...

6056
来自专栏熊二哥

快速入门系列--WebAPI--04在老版本MVC4下的调整

WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了。在之前的介绍中,基本上都基于.N...

2176
来自专栏我的小碗汤

自动评论csdn博客文章实现

今天我们来用java代码爬取csdn博客网站,然后自动评论,这一波操作可以说是相当风骚了,话不多说,咱上代码。

852
来自专栏Java与Android技术栈

为爬虫框架构建Selenium模块、DSL模块(Kotlin实现)

NetDiscover是一款基于Vert.x、RxJava2实现的爬虫框架。我最近添加了两个模块:Selenium模块、DSL模块。

762
来自专栏积累沉淀

Quartz学习

Quartz学习 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行。 运行环境 Quartz 能嵌入在其他应用程序里运行。 Q...

34410
来自专栏为数不多的Android技巧

请不要滥用SharedPreference

SharedPreference是Android上一种非常易用的轻量级存储方式,由于其API及其友好,得到了很多很多开发者的青睐。但是,SharedPrefer...

914
来自专栏腾讯数据库技术

玩转MyRocks/RocksDB--STATISTICS与后台线程篇

1602
来自专栏一个会写诗的程序员的博客

使用Kotlin 和 Jsoup库实现一个极简的HTML Parser库《Kotlin极简教程》正式上架:

当我们有了一个网页的源代码HTML,这个时候我们很想像在JavaScript中的DOM API一样操作解析这个页面的元素。

642

扫码关注云+社区