java爬取网页数据

最近使用java实现了一个简单的网页数据抓取,下面是实现原理及实现代码:

原理:使用java.net下面的URL对象获取一个链接,下载目标网页的源代码,利用jsoup解析源代码中的数据,获取你想要的内容

1.首先是根据网址下载源代码:

/**
     * 根据网址和编码下载源代码
     * @param url 目标网址
     * @param encoding 编码
     * @return
     */
    public static String getHtmlResourceByURL(String url,String encoding){
        
        //存储源代码容器
        StringBuffer buffer = new StringBuffer();
        URL urlObj = null;
        URLConnection uc = null;
        InputStreamReader isr = null;
        BufferedReader br =null;
        try {
            //建立网络连接
            urlObj = new URL(url);
            //打开网络连接
            uc = urlObj.openConnection();
            //建立文件输入流
            isr = new InputStreamReader(uc.getInputStream(),encoding);
            InputStream is = uc.getInputStream();
            //建立文件缓冲写入流
            br = new BufferedReader(isr);
            FileOutputStream fos = new FileOutputStream("F:\\java-study\\downImg\\index.txt");
            
            //建立临时变量
            String temp = null;
            while((temp = br.readLine()) != null){
                buffer.append(temp + "\n");
            }
//            fos.write(buffer.toString().getBytes());
//            fos.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            System.out.println("网络不给力,请检查网络设置。。。。");
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("你的网络连接打开失败,请稍后重新尝试!");
        }finally {
            try {
                isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        return buffer.toString();
    }

2.根据下载源代码解析数据,获取你想要的内容,这里我获取的是图片,你也可以获取贴吧里邮箱,电话号码等

/**
     * 获取图片路劲
     * @param url 网络路径
     * @param encoding 编码
     */
    public static void downImg(String url,String encoding){
        String resourceByURL = getHtmlResourceByURL(url, encoding);
        //2.解析源代码,根据网络图像地址,下载到服务器
        Document document = Jsoup.parse(resourceByURL);        
        //获取页面中所有的图片标签
        Elements elements = document.getElementsByTag("img");
        
        for(Element element:elements){
            //获取图像地址
            String src = element.attr("src");
            //包含http开头
            if (src.startsWith("http") && src.indexOf("jpg") != -1) {
                getImg(src, "F:\\java-study\\downImg");
            }
        }
    }

3.根据获取的图片路径,下载图片,这里我下载的是携程网的内容

/**
     * 下载图片
     * @param imgUrl 图片地址
     * @param filePath 存储路劲
     * 
     */
    public static void getImg(String imgUrl,String filePath){
        
        String fileName = imgUrl.substring(imgUrl.lastIndexOf("/"));
        
        try {
            //创建目录
            File files = new File(filePath);
            if (!files.exists()) {
                files.mkdirs();
            }
            //获取地址
            URL url = new URL(imgUrl);
            //打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //获取输入流
            InputStream is = connection.getInputStream();
            File file = new File(filePath + fileName);
            //建立问价输入流
            FileOutputStream fos = new FileOutputStream(file);
            
            int temp = 0;
            while((temp = is.read()) != -1){
                fos.write(temp);
            }
            is.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最后是调用过程

public static void main(String[] args) {
        
        //1.根据网址和页面编码集获取网页源代码
        String encoding = "gbk";
        String url = "http://vacations.ctrip.com/";
        //2.解析源代码,根据网络图像地址,下载到服务器
        downImg(url, encoding);
        
    }

总结:根据上面的实现的简单数据爬取,存在着一些问题,我爬取的旅游页面有很多图片,根据img属性获取其src中的地址,从而下载该图片,但是该页面有很多图片,结果自己却只能爬到一小部分,如下图:

我将下载的源代码写入文件,和原网页中做对比,基本上页面旅游的图片一张没有,源代码中也没有,不知道为什么,请求广大网友的解答

转载于:https://www.cnblogs.com/linlinyu/p/8679216.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值