Java实现爬取百度图片的方法分析

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Java网络编程技巧总结》、《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • 详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片

    利用Java抓取网页上的所有图片: 用两个正则表达式: 1.匹配html中img标签的正则:<img.*src=(.*?)[^>]*?> 2.匹配img标签中得src中http路径的正则:http:\"?(.*?)(\"|>|\\s+) 实现: package org.swinglife.main; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream;

  • java代理实现爬取代理IP的示例

    仅仅使用了一个java文件,运行main方法即可,需要依赖的jar包是com.alibaba.fastjson(版本1.2.28)和Jsoup(版本1.10.2) 如果用了pom,那么就是以下两个: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </depe

  • 详解Java两种方式简单实现:爬取网页并且保存

    对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错误,就要调试很多时间,太浪费时间. 后来一想,既然早早给自己下了保证,就先实现它吧,从简单开始,慢慢增加功能,有时间就实现一个,并且随时优化代码. 下面是我简单实现爬取指定网页,并且保存的简单实现,其实有几种方式可以实现,这里慢慢添加该功能的几种实现方式. UrlConnection爬取实现 package html; import java.io.BufferedReader; i

  • Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

    1.需求及配置 需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格. 使用Maven项目,log4j记录日志,日志仅导出到控制台. Maven依赖如下(pom.xml) <dependencies> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId>

  • java实现爬取知乎用户基本信息

    本文实例为大家分享了一个基于JAVA的知乎爬虫,抓取知乎用户基本信息,基于HttpClient 4.5,供大家参考,具体内容如下 详细内容: 抓取90W+用户信息(基本上活跃的用户都在里面) 大致思路: 1.首先模拟登录知乎,登录成功后将Cookie序列化到磁盘,不用以后每次都登录(如果不模拟登录,可以直接从浏览器塞入Cookie也是可以的). 2.创建两个线程池和一个Storage.一个抓取网页线程池,负责执行request请求,并返回网页内容,存到Storage中.另一个是解析网页线程池,负

  • Java实现的爬虫抓取图片并保存操作示例

    本文实例讲述了Java实现的爬虫抓取图片并保存操作.分享给大家供大家参考,具体如下: 这是我参考了网上一些资料写的第一个java爬虫程序 本来是想获取煎蛋网无聊图的图片,但是网络返回码一直是503,所以换了网站 import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStre

  • Java实现爬取往期所有双色球开奖结果功能示例

    本文实例讲述了Java实现爬取往期所有双色球开奖结果功能.分享给大家供大家参考,具体如下: 梦想还是要有的,万一实现了呢?我相信经常买双色球的朋友和我都会有一个疑问,就是往期双色球的开奖结果是什么?我钟意的这一注双色球在往期是否开过一等奖,如果开过的话,基本上可以放弃这一注了,因为历史上应该没有出现过两期双色球开奖完全一致的吧?那么往期的开奖结果是什么呢?我自己用Java写了一个简易的类,爬取所有双色球开奖结果,本来想开发安卓版本的,由于UI等需要时间准备,有缘再开发吧. import java

  • Java实现爬取百度图片的方法分析

    本文实例讲述了Java实现爬取百度图片的方法.分享给大家供大家参考,具体如下: 在以往用java来处理解析HTML文档或者片段时,我们通常会采用htmlparser(http://htmlparser.sourceforge.net/)这个开源类库.现在我们有了JSOUP,以后的处理HTML的内容只需要使用JSOUP就已经足够了,JSOUP有更快的更新,更方便的API等. jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,

  • python实现爬取百度图片的方法示例

    本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests import os import re import sys word=input("请输入关键字:") path="./ok" if not os.path.exists(path): os.mkdir(path) word=urllib.parse.quote(w

  • Python爬虫:通过关键字爬取百度图片

    使用工具:Python2.7 点我下载 scrapy框架 sublime text3 一.搭建python(Windows版本)  1.安装python2.7 ---然后在cmd当中输入python,界面如下则安装成功  2.集成Scrapy框架----输入命令行:pip install Scrapy 安装成功界面如下: 失败的情况很多,举例一种: 解决方案: 其余错误可百度搜索. 二.开始编程. 1.爬取无反爬虫措施的静态网站.例如百度贴吧,豆瓣读书. 例如-<桌面吧>的一个帖子https:

  • 利用python批量爬取百度任意类别的图片的实现方法

    利用python批量爬取百度任意类别的图片时: (1):设置类别名字. (2):设置类别的数目,即每一类别的的图片数量. (3):编辑一个txt文件,命名为name.txt,在txt文件中输入类别,此类别即为关键字.并将txt文件与python源代码放在同一个目录下. python源代码: # -*- coding: utf-8 -*- """ Created on Sun Sep 13 21:35:34 2020 @author: ydc """

  • Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例

    本文实例讲述了Python实现爬取百度贴吧帖子所有楼层图片的爬虫.分享给大家供大家参考,具体如下: 下载百度贴吧帖子图片,好好看 python2.7版本: #coding=utf-8 import re import requests import urllib from bs4 import BeautifulSoup import time time1=time.time() def getHtml(url): page = requests.get(url) html =page.text

  • Python实现的爬取百度贴吧图片功能完整示例

    本文实例讲述了Python实现的爬取百度贴吧图片功能.分享给大家供大家参考,具体如下: #coding:utf-8 import requests import urllib2 import urllib ``` from lxml import etree class Tieba: def __init__(self): self.tiebaName = raw_input("请输入需要爬取的贴吧:") self.beginPage = int(raw_input("请输入

  • python爬虫之爬取百度音乐的实现方法

    在上次的爬虫中,抓取的数据主要用到的是第三方的Beautifulsoup库,然后对每一个具体的数据在网页中的selecter来找到它,每一个类别便有一个select方法.对网页有过接触的都知道很多有用的数据都放在一个共同的父节点上,只是其子节点不同.在上次爬虫中,每一类数据都要从其父类(包括其父节点的父节点)上往下寻找ROI数据所在的子节点,这样就会使爬虫很臃肿,因为很多数据有相同的父节点,每次都要重复的找到这个父节点.这样的爬虫效率很低. 因此,笔者在上次的基础上,改进了一下爬取的策略,笔者以

  • Python爬虫将爬取的图片写入world文档的方法

    作为初学爬虫的我,无论是爬取文字还是图片,都可以游刃有余的做到,但是爬虫所爬取的内容往往不是单独的图片或者文字,于是我就想是否可以将图文保存至world文档里,一开始使用了如下方法保存图片: with open('123.doc','wb')as file: file.write(response.content) file.close() 结果就是,world文档里出现了一堆乱码,此法不同,我就开始另寻他法,找了很久也没有找到,只找到了关于Python操作world的方法. 于是我就开始了新的

  • 教你用python3根据关键词爬取百度百科的内容

    前言 关于python版本,我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,因为编码什么的问题,觉得2还是没有3方便.而且在网上找到的2中的一些资料稍微改一下也还是可以用. 好了,开始说爬百度百科的事. 这里设定的需求是爬取北京地区n个景点的全部信息,n个景点的名称是在文件中给出的.没有用到api,只是单纯的爬网页信息. 1.根据关键字获取url 由于只需要爬取信息,而且不涉及交互,可以使用简单的方法而不需要模拟浏览器. 可以直接

  • SpringBoot中使用Jsoup爬取网站数据的方法

    爬取数据 导入jar包 <properties> <java.version>1.8</java.version> <elasticsearch.version>7.6.1</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.jsoup</groupId> <artifactI

随机推荐