使用Java IO流实现网页数据爬取(一)

使用Java实现网页数据爬取(IO流)

第一阶段:爬取网页源码及所有链接地址

引入代码步骤:
1.将ClimbImg.java,Demo.java文件导入

ClimbImg.java
爬取网页雏形 :功能非常有限,没有筛选后缀,只能单独读取一个地址,文件也不是生成在当前目录下,具体功能:爬取网页源码及链接,更改爬取地址可以爬取图片等…筛选功能尚未完成,雏形

  • package Demo;
    
    import org.apache.commons.io.FileUtils;
    
    import java.io.*;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    /**
     * 爬取网页雏形 :功能非常有限,没有筛选后缀,只能单独读取一个地址,文件也不是生成在当前目录下
     * ClimbImg这个类用于爬取网页的一些数据,可以是源码可以是图片,可以是文档,使用方式也非常简单
     * 使用构造方法创建对象即可,例如: ClimbImg climbImg = new ClimbImg("https://blog.csdn.net/weixin_43324515");
     * 将网址填入到构造方法中,构造方法分别有四种构造方法:
     * 首先是最原始的无参构造,这里不做多解释
     * 第二种构造方法一个参数,参数对应的是爬取的地址
     * 第三种构造方法需要地址和创建地址,这个构造方法用于将爬取到的文件创建在指定的位置
     * 第四种构造方法就是在第三种的基础上添加了自定义文件名
     * 常量:
     * URL_PATH 没有默认值,如果为空那么会显示:Not Path!异常提醒(爬取地址)
     * SUFFIX 默认值为被爬取地址的后缀(后缀) 暂时不可更改!
     * NEW_PATH 默认值为桌面的相对路径 (爬取数据的文件存放地址) 可以使用构造方法自定义!
     * FILE_NAME 默认值为UUID生成的随机标识 可以通过构造方法更改!
     * PATH 默认值为NEW_PATH(存放的相对路径)+FILE_NAME(文件名)+SUFFIX(后缀) 此参数不可以更改!
     * 方法:
     * init():初始化方法,与每一个构造方法相互链接,作用于:判断是否需要更改常量的默认值(默认调用|无参数)
     * getFileName():获取爬取的文件对应的后缀方法,作用于:将创建的文件命名规范(默认调用|无参数)
     * getCoding():读取文件的源码方法,作用于:浏览文件源码或配合其他方法执行操作(手动调用|无参数)
     * createFile():用于将文件创建的方法,需要借助到两个参数,第一个是爬取的地址,第二个是创建的地址("核心方法"默认调用|有参数)
     * getImgPath(): 用于获取源码中一些指定的标签,此方法需要借助到两个参数,分别是前缀(prefix)与后缀(suffix),返回值为一个list集合
     */
    public class ClimbImg {
    
        /**
         * URL_PATH:爬取地址
         * SUFFIX:文件后缀 默认为爬取地址相同
         * NEW_PATH:相对路径  默认为桌面
         * FILE_NAME:文件名   默认为UUID唯一标识
         * PATH:新建文件完整路径
         */
    
        private static String URL_PATH;
        private static String SUFFIX;
        private static String NEW_PATH;
        private static String FILE_NAME;
        private static String PATH;
    
        /**
         * 执行方法
         *
         * @param URL_PATH 爬取路径
         * @param PATH     生成路径
         */
        static void createFile(String URL_PATH, String PATH) throws IOException {
            FileUtils.copyURLToFile(new URL(URL_PATH), new File(PATH));
        }
    
        /**
         * 初始化判断赋值方法
         */
        static void init() {
            if (URL_PATH == null || URL_PATH.length() < 1) {
                System.err.println("Not Path!");
                return;
            }
            SUFFIX = URL_PATH.substring(URL_PATH.lastIndexOf("."), URL_PATH.length());
            if (NEW_PATH == null) {
                NEW_PATH = "C:\\Users\\admin\\Desktop\\";
            }
            if (FILE_NAME == null) {
                FILE_NAME = getFileSuffix();
            }
            PATH = NEW_PATH + FILE_NAME + SUFFIX;
            if (URL_PATH != null && PATH != null) {
                try {
                    createFile(URL_PATH, PATH);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 获得后缀方法
         *
         * @return 直接返回唯一标识
         */
        static String getFileSuffix() {
            return UUID.randomUUID().toString();
        }
    
        String getPath() {//获取当前类的工厂绝对路径
            return this.getClass().getResource("").getPath().substring(1, this.getPath().length());
        }
    
        /**
         * 读取创建的文件内容
         *
         * @return 读取到的文件信息
         */
        private static String value;
    
        public String getCoding() {
            try {
                FileReader fileReader = new FileReader(PATH);
                BufferedReader bufferedReader = new BufferedReader(fileReader);
                String data = "";
                while ((data = bufferedReader.readLine()) != null) {
                    value += data + "\r\n";
                }
                bufferedReader.close();
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return value;
        }
    
        /**
         * 爬取网页中指定的前缀加后缀之间的值,例如爬取网址,爬取img标签
         * @param prefix 前缀
         * @param suffix 后缀
         * @return 返回通过前缀和后缀截取出来的中间数据
         */
        public List getImgPath(String prefix,String suffix,boolean type) {
            String str = getCoding();
            String[] line = str.split("\n");
            String[] values;
            List list = new ArrayList();
            for (String value : line) {
                values = value.split("\"");
                for (String val : values) {
                    int vL = val.length();
                    int pL = prefix.length();
                    int sL = suffix.length();
                    if(vL>pL&&val.substring(0,pL).equals(prefix)) {
                        if (val.substring(vL-sL).equals(suffix))
                            list.add(val);
                    }
                }
            }
            return list;
        }
    
    
        /**
         * 构造方法区域 ↓
         */
    
        public ClimbImg() {
            init();
        }
    
        /**
         * 带参,自定义爬取路径
         *
         * @param URL_PATH 自定义爬取路径
         */
        public ClimbImg(String URL_PATH) {
            this.URL_PATH = URL_PATH;
            init();
        }
    
        /**
         * 带参
         *
         * @param URL_PATH 自定义爬取路径
         * @param NEW_PATH 自定义新建路径
         */
        public ClimbImg(String URL_PATH, String NEW_PATH) {
            this.URL_PATH = URL_PATH;
            this.NEW_PATH = NEW_PATH;
            init();
        }
    
        /**
         * 指定爬取路径 指定生成路径 指定文件名
         *
         * @param URL_PATH  爬取路径
         * @param NEW_PATH  生成路径
         * @param FILE_NAME 文件名
         */
        public ClimbImg(String URL_PATH, String NEW_PATH, String FILE_NAME) {
            this.URL_PATH = URL_PATH;
            this.NEW_PATH = NEW_PATH;
            this.FILE_NAME = FILE_NAME;
            init();
        }
    
        /**
         * 构造方法区域 ↑
         */
    }
    

Demo.java

  • package Demo;
    
    import java.util.List;
    
    public class Demo {
        public static void main(String[] args) {
            /**
             * 默认将源码文件生成在桌面
             * IO流传递外连接数据需要借助网络
             */
            ClimbImg climbImg = new ClimbImg("https://blog.csdn.net/weixin_43324515?spm=1001.2100.3001.5343");
            System.out.println(climbImg.getCoding());
            List list = climbImg.getImgPath("http","",true);
            for (Object o : list) {
                System.out.println(o);
            }
            System.out.println("网页链接数据总数:"+list.size());
        }
    }
    
2.导入外部commons-io-2.4 .jar

下载链接:https://mvnrepository.com/artifact/commons-io/commons-io/2.4

3.运行

部分运行结果如下:

https://csdnimg.cn/release/cmsfe/public/js/runtime.5aafb0f2.js
https://csdnimg.cn/release/cmsfe/public/js/chunk/common.1c062ef5.js
https://csdnimg.cn/release/cmsfe/public/js/chunk/tpl/user-profile/index.65a1e748.js
https://g.csdnimg.cn/side-toolbar/3.0/side-toolbar.js
https://g.csdnimg.cn/common/csdn-toolbar/csdn-toolbar.js
https://g.csdnimg.cn/user-medal/1.0.6/user-medal.js
https://g.csdnimg.cn/static/logo/favicon32.ico
https://blog.csdn.net/weixin_43324515
https://g.csdnimg.cn/??lib/jquery/1.12.4/jquery.min.js,user-tooltip/2.2/user-tooltip.js,lib/qrcode/1.0.0/qrcode.min.js
https://g.csdnimg.cn/login-box/1.1.4/login-box.js
https://csdnimg.cn/release/cmsfe/public/css/common.b8a8ed41.css
https://csdnimg.cn/release/cmsfe/public/css/tpl/user-profile/index.d670f488.css
https://profile.csdnimg.cn/A/6/C/1_weixin_43324515
https://im.csdn.net/im/main.html?userName=weixin_43324515
https://img-home.csdnimg.cn/images/20210108035944.gif
https://blog.csdn.net/blogdevteam/article/details/103478461
https://csdnimg.cn/identity/blog2.png
https://www.csdn.net/vip
https://i.csdn.net/#/user-center/auth
https://i.csdn.net/#/user-center/auth
https://blog.csdn.net/rank/list/total
https://profile.csdnimg.cn/A/6/C/1_weixin_43324515
https://csdnimg.cn/medal/qixiebiaobing1@240.png
https://profile.csdnimg.cn/A/6/C/1_weixin_43324515
https://blog.csdn.net/weixin_43324515/category_10916399.html
https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_64,w_64
https://blog.csdn.net/weixin_43324515/category_10848740.html
https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_64,w_64
https://img-home.csdnimg.cn/images/20210127052220.png
https://img-home.csdnimg.cn/images/20210127052218.png
https://img-home.csdnimg.cn/images/20210127052220.png
https://img-home.csdnimg.cn/images/20210127052218.png
https://g.csdnimg.cn/common/csdn-footer/csdn-footer.js
http:\u002F\u002Fcms-user.internal.csdn.net
https:\u002F\u002Fprofile.csdnimg.cn\u002FA\u002F6\u002FC\u002F1_weixin_43324515
https:\u002F\u002Fblog.csdn.net\u002Fweixin_43324515
https:\u002F\u002Fim.csdn.net\u002Fim\u002Fmain.html?userName=weixin_43324515
https:\u002F\u002Fcsdnimg.cn\u002Fidentity\u002Fblog2.png
https:\u002F\u002Fimg-home.csdnimg.cn\u002Fimages\u002F20210108035944.gif
https:\u002F\u002Fimg-home.csdnimg.cn\u002Fimages\u002F20210120054229.jpg
https:\u002F\u002Fimg-home.csdnimg.cn\u002Fimages\u002F20210114022819.png
https:\u002F\u002Fimg-home.csdnimg.cn\u002Fimages\u002F20210114022831.png
https:\u002F\u002Fimg-home.csdnimg.cn\u002Fimages\u002F20210114022828.png
https:\u002F\u002Fcsdnimg.cn\u002Fmedal\u002Fqixiebiaobing1@240.png
https:\u002F\u002Feditor.csdn.net\u002Fmd\u002F
https:\u002F\u002Fimg-blog.csdnimg.cn\u002F20190918140012416.png?x-oss-process=image\u002Fresize,m_fixed,h_64,w_64
https:\u002F\u002Fblog.csdn.net\u002Fweixin_43324515\u002Fcategory_10916399.html
https:\u002F\u002Fimg-blog.csdnimg.cn\u002F20190918140037908.png?x-oss-process=image\u002Fresize,m_fixed,h_64,w_64
https:\u002F\u002Fblog.csdn.net\u002Fweixin_43324515\u002Fcategory_10848740.html
https:\u002F\u002Fcms-mall.csdn.net\u002F
http:\u002F\u002Fcms-community-api.internal.csdn.net\u002F
https:\u002F\u002Fcms-api.csdn.net\u002F
https:\u002F\u002Fpassport.csdn.net\u002Faccount\u002Flogin
https:\u002F\u002Fcommunity-api.csdn.net\u002F
http:\u002F\u002Fcommunity-cloud-api.csdn.net\u002F
https:\u002F\u002Fmp-ask.csdn.net\u002F
https:\u002F\u002Fme.csdn.net\u002F
https:\u002F\u002Fecf38ba949474cb891ff04c224d990dd@sentry.csdn.net\u002F20
https:\u002F\u002Fblog.csdn.net\u002F
https:\u002F\u002Fmall.csdn.net\u002F
https:\u002F\u002Fblog.csdn.net\u002Fweixin_43324515
https://csdnimg.cn/release/cmsfe/public/js/runtime.5aafb0f2.js
https://csdnimg.cn/release/cmsfe/public/js/chunk/common.1c062ef5.js
https://csdnimg.cn/release/cmsfe/public/js/chunk/tpl/user-profile/index.65a1e748.js
https://g.csdnimg.cn/side-toolbar/3.0/side-toolbar.js
https://g.csdnimg.cn/common/csdn-toolbar/csdn-toolbar.js
https://g.csdnimg.cn/user-medal/1.0.6/user-medal.js
网页数据总数:122

第二阶段将爬取到的可用网页抽取出来二次深层爬,例如css,js,png,jpg…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值