吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4244|回复: 37
收起左侧

[Java 原创] 【java】 用最简单的代码写爬虫

  [复制链接]
黑猫的猫 发表于 2020-7-31 23:26
本帖最后由 黑猫的猫 于 2020-7-31 23:34 编辑

这里我编写了两个类,一个是CatHttp,一个是测试代码用的类。 CatHttp主要是用来写调用方法的,简化测试代码的代码量。
这里那b站做例子,pc端网页,首先访问网页获取页面源代码

- 访问并获取网页源码
[Java] 纯文本查看 复制代码
//CatHttp类
	public String getHttpText(String Url) {
		// TODO Auto-generated method stub
		try {

			// 获取url
			url = new URL(Url);
			// 下载资源
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setRequestProperty("User-Agent",
					"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
			String msg = null;
			String urlString = "";
			while (null != (msg = br.readLine())) {
				urlString += msg + "\n";
			}
//			System.out.println(urlString);
			br.close();
			return urlString;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return null;
		}
	}


获取这个class的内容,写个内容截取方法,截取方法我做了多个判断,以便使用。
还有一点就是用来索引的字符会在返回时去除,这么做的原因是因为我以前在一款编程软件使用的习惯,而substring方法+indexof方法索引的字符会去尾留头。这样在获取详细信息时可能会造成一些美观上的问题。()。

  • 截取方法
[Java] 纯文本查看 复制代码
public String interception(String nr, String str1, String str2) {
		// 传入数据, 截取内容,并返回截取结果
		try {

			String interception = null;
			if (str2 == null) {
				interception = nr.substring(nr.indexOf(str1));
				return interception.replace(str1, "");

			} else if (str1 == null) {
				return interception = nr.substring(0, nr.indexOf(str2));
			} else {
				nr = nr.substring(nr.indexOf(str1));
				interception = nr.substring(0, nr.indexOf(str2));
				return interception.replace(str1, "");
			}
		} catch (StringIndexOutOfBoundsException e) {
			// TODO: handle exception
			System.err.println("超出数组或索引范围");
		} catch (NullPointerException e) {
			System.err.println("引用对象为空");
		}
		return null;

	}

调用截取方法执行返回

内容获取成功,但是我需要获取的可不止一条内容,而是所有包含该class的标签的内容。

  • 列表添加和读取方法
  • [Java] 纯文本查看 复制代码
     private LinkedList<String> list = null;
     public void setList(String str1, String str2) {
    		// 传入一个数据,设置一个分割符并转化为列表形式
    		list = new LinkedList<String>();
    		String[] temp = str1.split(str2); // 分割字符串
    		for (int i = 0; i < temp.length; i++) {
    			list.add(temp[i]);
    		}
    	}
    
    	public LinkedList<String> getList() {
    		return list;
    	}
     
    

  • 测试代码类
[Java] 纯文本查看 复制代码
 for (String cat : h.getList()) {
			 System.out.println(cat);
			 System.out.println("-----------------------");
			 
		 }

写完这些方法之后该就该传入数据了,根据网页的class获取标签并获取标签内的内容,还要传入一个字符串作为数组的分隔符。

- 通过class获取标签内容完整代码
[Java] 纯文本查看 复制代码
public void getLabcont(String nr, String Class) {
		// 获取class内容方法
		String cont = null;
		String n = "";
		String lab = null;
		boolean is = false;
		this.setList(nr, "<");
		for (String cat : this.getList()) {
//			System.out.println(cat);
			if (is == false) {
				if (cat.indexOf(Class) > -1) {
					cat = "<" + cat;
					cont = this.interception(cat, "<", Class);
					cont = this.interception(cont, null, " ");
//					lab = "</" + cont + ">";
					n = n + cat;
					is = true;
				} else {
					is = false;
				}
			} else if (is == true) {
				if (cat.indexOf(cont) > -1) {
					lab = "</" + cont + ">";
					n = n + cat + lab;
					cont = this.interception(nr, cont, "\">");
					is = false;
				} else {
					n = n + cat;
//					System.out.println(n);

				}
			}
		}
// System.out.println(n);
		this.setList(n, lab);

	}
}

代码解释一下,因为在前面说过传入的截取用的字符串会被去除,所以我这里做了补全,顺便再在补全的基础上加上了用来作为分隔符的字符串^_<
代码执行结果如下
都已经做到这一步了,再再表演一下截取方法的用法
- 让输出人内容更漂亮点
[Java] 纯文本查看 复制代码
for (String cat : h.getList()) {
			url = h.interception(cat, "a href=\"//", "\" target=\"");
			jpg = h.interception(cat, "img src=\"//", "\" alt=\"");
			zuo = h.interception(cat, " alt=\"","\">div class");
			System.out.println("视频标题:"+zuo+"\n视频封面:"+jpg+"\n视频链接地址:"+url+"\n\n");

		}

程序执行结果如图:

这样实现方法后差不多等同于一个简单得爬虫程序了,嘿嘿嘿。
csdn下载:  完整代码下载
普通下载: java简单爬虫.zip (2.86 KB, 下载次数: 49)

原文地址:https://blog.csdn.net/qq_19883981/article/details/107603196

我应该不用给自己授权吧。

免费评分

参与人数 6吾爱币 +5 热心值 +4 收起 理由
lovervalue + 1 我很赞同!
zhinian1 + 1 + 1 我很赞同!
lendone + 1 谢谢@Thanks!
1113 + 1 + 1 我很赞同!
diwang2580 + 1 + 1 我很赞同!
zhuqi666 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 黑猫的猫 发表于 2020-8-1 00:42
C哥888 发表于 2020-8-1 00:41
这确实简单的爬虫,但你爬的是什么内容?

视频封面,标题,原地址,,很难看出来吗
 楼主| 黑猫的猫 发表于 2020-10-6 21:54
O天才小熊猫O 发表于 2020-10-5 17:49
这样爬的话 应该只能爬静态页面的数据吧?动态页面会遗漏很多其他信息的

可以换一下其他方式,方法都差不多的,我只是突发奇想搞了一下,hhh
aixxa 发表于 2020-7-31 23:36
 楼主| 黑猫的猫 发表于 2020-7-31 23:40
aixxa 发表于 2020-7-31 23:36
不明觉厉的样子

我感觉你只是想抢沙发
djnym 发表于 2020-7-31 23:56
大佬牛批,值得学习
Richardz 发表于 2020-8-1 00:01
有值得借鉴
羽一衹芐 发表于 2020-8-1 00:02
感谢大佬分享知识
wk3 发表于 2020-8-1 00:13
学习一下!感谢分享
C哥888 发表于 2020-8-1 00:41
这确实简单的爬虫,但你爬的是什么内容?
repobor 发表于 2020-8-1 01:27
果然还是python最简单。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表