使用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…