网页内容抓取 图片的抓取方法

7 篇文章 0 订阅
4 篇文章 0 订阅

  DOWNLOADPIC下载图片方法:

   package com.bwjf.webapp.util;


import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class picHtmlDown {
private static int COUNT = 0;
private static int DOWN_COUNT = 0;


public static void jsoupHTML(String urlPath) throws Exception {
Document doc = Jsoup.connect(urlPath).timeout(1000000).get();
// :当前页中的图片
Elements srcLinks = doc.select("a[class$=title-logo]");


for (Element link : srcLinks) {
// 
String imagesPath = link.childNode(0).attr("src");//
           
String engName = link.attr("href");
System.out.println("当前访问路径:" + imagesPath);
    
getImages(imagesPath, "d://images//0000" + COUNT++ + ".png");
// getImages(imagesPath, "d://images//0000"+ ++COUNT +".png");
}


}


/**
* @param urlPath
*            图片路径
* @throws Exception
*/
public static void getImages(String urlPath, String fileName)
throws Exception {


URL url = new URL(urlPath);// :获取的路径
// :http协议连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();


conn.setRequestMethod("GET");
conn.setReadTimeout(6 * 10000);
if (conn.getResponseCode() < 10000) {
InputStream inputStream = conn.getInputStream();
byte[] data = readStream(inputStream);
if (data.length > (1024 * 10)) {
FileOutputStream outputStream = new FileOutputStream(fileName);
outputStream.write(data);
System.out.println("第" + ++DOWN_COUNT + "图片下载成功");
outputStream.close();
}


}
}


/**
* 读取url中数据,并以字节的形式返回
* @param inputStream
* @return
* @throws Exception
*/
public static byte[] readStream(InputStream inputStream) throws Exception {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
inputStream.close();
return outputStream.toByteArray();
}
/********************调用下面俩个方法就可以实现局部具体标签信息的抓取,具体操作根据具体的需要来改变**********/
/**
*通过路径下载图片  方法:1
* @param args
* @throws IOException
*/
public static String daownPic(String url, String path) throws IOException {
URL ul = new URL(url);
DataInputStream dis = new DataInputStream(ul.openStream());
//下载的图片生成一个新的文件路径
String newPicName = "d://imagess//"+path;
FileOutputStream fis = new FileOutputStream(new File(newPicName));
byte[] buffer = new byte[2048];
int length;
while ((length = dis.read(buffer)) > 0) {
fis.write(buffer, 0, length);
}
fis.close();
dis.close();
return newPicName;
}
   //测试方法
public static void main(String[] args) {
try {


jsoupHTML("A", "奥迪", "http://car.bitauto.com/tree_chexing/mb_9/");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("共访问" + COUNT + "张图片,其中下载" + DOWN_COUNT + "张图片");
}
}
   /**
    *  方法 2
    * @param firstChar
    * @param name
    * @param urlPath
    * @return
    * @throws Exception
    */
public static String jsoupHTML(String firstChar, String name, String urlPath)
throws Exception {
String pathh="";
//通过Jsoup包中的方法与传入的网址建立连接并生成一个Document对象
Document doc = Jsoup.connect(urlPath).timeout(1000000).get();
    // :当前页中的图片,
//通过Document对象取属性值为:title-logo的a标签,得到一个Elements元素对象
Elements srcLinks = doc.select("a[class$=title-logo]");
//遍历这个Elements
for (Element link : srcLinks) {
// 通过childNode(0)方法找到当前a标签的对象,并通过attr方法得到src的值,即图片的链接路径
String imagesPath = link.childNode(0).attr("src");
//通过a标签的href属性获取其href属性值,并将形式如:"/Audi/",通过replaceAll方法将"/"去除
//只取其中值得到图片对应的英文名称

String engName = link.attr("href").replaceAll("/", "");

System.out.println("当前访问图片的英文名称:"+engName);

System.out.println("当前访问图片路径:" + imagesPath);

//A/audi/奥迪.png生成的图片保存路径,通过传入的数据拼接需要的图片保存名称

String path = firstChar+engName+name + ".png";

//TODO update where name and firstchar数据库 set ename=engName  , img=path

System.out.println("当前生成的文件名称:"+path);

//传入上面获取的图片路径和图片名称 .通过图片下载方法返回一个图片生成在本地的图片全路径,

//方便后面的数据库存储操作

String picPath = daownPic(imagesPath,path);

//返回图片路径和图片英文名称,方便后面数据库保存的时候取值处理

 pathh=picPath+","+engName;
}
    return pathh;
}
}

 MysqlUTIL数据操作保存方法:

package com.bwjf.webapp.util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
  /**
   * 数据库连接工具类
   * 
   * @author Administrator
   *
   */
public class MysqlUtil {
private static final String URL= "jdbc:mysql://192.168.0.222:3306/cars?"
            + "user=root&password=soft123&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";
/**获取mysql数据库连接对象方法 这个没用上**/
public static Connection getConnection(String URL){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL);
}catch (Exception e1){
e1.printStackTrace();
return conn;
}
 //以下集成了所有操作,也可以分开写
public static void main(String[] args) throws Exception {
        Connection conn = null;
        
        // MySQL的JDBC URL编写方式:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值
        // 避免中文乱码要指定useUnicode和characterEncoding
        // 执行数据库操作之前要在数据库管理系统上创建一个数据库,名字自己定,
        // 下面语句之前就要先创建javademo数据库
        String url = "jdbc:mysql://192.168.0.222:3306/cars?"
                + "user=root&password=soft123&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";
        try {
            // 之所以要使用下面这条语句,是因为要使用MySQL的驱动,所以我们要把它驱动起来,
            // 可以通过Class.forName把它加载进去,也可以通过初始化来驱动起来,下面三种形式都可以
            Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动
            // or:
            // com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
            // or:
            // new com.mysql.jdbc.Driver();
 
            System.out.println("成功加载MySQL驱动程序");
            // 一个Connection代表一个数据库连接
            conn = DriverManager.getConnection(url);
            // Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等
            String  sql = "select * from t_cars";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){
                //遍历查询结果,取出需要的字段信息
             String name=rs.getString("name");
             String chars = rs.getString("firstchar");
             String urls = rs.getString("url");   
             //传入对应的网页路径获取对应网页上具体标签的所需内容
             String picurl = picHtmlDown.jsoupHTML(chars,name,urls);
             String[] pic = picurl.split(",");  
               //将查到的图片名称和生成的图片路径保存到数据库
             String sqll = "update t_cars set img=? , ename=? where url=?;";
             PreparedStatement pstmt = conn.prepareStatement(sqll);
             //动态设定参数
              pstmt.setString(1, pic[0]);
             pstmt.setString(2, pic[1]);
             pstmt.setString(3, urls);
                int rss = pstmt.executeUpdate();
                pstmt.close();
            }
        } catch (SQLException e) {
            System.out.println("MySQL操作错误");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
 
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值