java网络爬虫之核心原理

  近来因为特殊需要,需要获得一定量的数据。这让我下意识的就想到了用网络爬虫来达成目的。
之前常听网络爬虫,也知道Python在这方面非常火热,但自我感觉还是对Java稍微熟悉一点,并且得知Java用来做爬虫也很方便,所以就去查了相关资料,在此分享我的心得。
  没有枯燥的专业术语,文章的目的只是为了更好的理解其中的核心原理,帮助初学者快速入门!


一.网络三分游

  网络爬虫网络爬虫,我们有必要简单了解下网络的相关知识。

1.URL

  URL可被看作是一个互联网资源的名字。比如我们在浏览器地址栏输入https://www.baidu.com,这就是一个URL,用来告诉浏览器想要访问哪台机器上的哪个资源(网页,文件…)。浏览器根据这个名字去对应服务器找资源,服务器把对应的资源发送给浏览器,浏览器再展示给我们。
  下面来看几个例子:

URL为:https://www.baidu.com/浏览器展示页面
URL为:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=网络

对应百度服务器关键字为“网络”的资源

URL为:https://cn.bing.com/th?id=OHR.Montreux_ZH-CN5485205583_1920x1080.jpg&rf=LaDigue_1920x1080.jpg

必应首页图片
访问必应首页的背景图。

2.HTTP协议

  当今,每天在浏览器地址栏上面输入要访问的URL,访问Web页面,几乎是我们所有人每天都会做的事(面向浏览器编程)。我们输入的URL中已经指定了数据交互的协议,如上面例子中URL的开头部分https。通俗的讲,协议就是一种规则,大家按这个规则来,不会乱,不易出错。
  你就比如两个人要进行约一个地方碰头,共同约定了个暗号天王盖地虎…,晚上十点小巷子里碰面。时候已到,黑影之中,一声天王盖地虎,黑暗之中有人应道:到我是二百五。这时大家就知道人没错,可以现身碰头了。
  同样,浏览器跟服务器交互,也需要一种约定,一种规则,HTTP协议就是其中的一种(HTTPS基于HTTP,安全性好)。说白了就是,浏览器向服务器要资源,怎么要?发个暗号,服务器给浏览器资源,怎么给?同样需要发个暗号

  浏览器向服务器要资源时,发的暗号:(浏览器按F12可查看)

在这里插入图片描述

  服务器给浏览器发资源时,发的暗号:(浏览器按F12可查看)

服务器发送给浏览器的暗号
如果大家暗号对上了,就可以愉快的传数据(“碰头”)了,反映出来的就是我们可以看小视频了(学习视频),听歌了等等。

二.网络爬虫

  简单理解,网络爬虫就是,通过代码,模拟出浏览器跟服务器交互的过程(碰头),以此获得服务器上的数据。

1.通过java的net包

  既然要用代码模拟,那我们接下来就是代码。Java的net包中,包含模拟浏览器跟服务器的相关类。

  Demo1
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * 模拟浏览器发送请求,接收数据
 * @author luckyriver
 *
 */
public class URL_Demo {
	/**
	 * 以访问百度首页为例
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		//对应浏览器地址栏输入URL
		URL url=new URL("https://www.baidu.com");//创建URL对象,相信大家已经知道了什么是URL,构造方法传入想要访问的URL

		//对应地址栏输入后点击连接
		URLConnection con=url.openConnection();//调用URL对象的openConnection()方法,字面意思,打开连接,获得连接对象

		String type=con.getContentType();//content-type是浏览器回应我们的“暗号的一部分”
		System.out.println("部分暗号:"+type);//

		//这时,对过暗号之后,就可以开始发送请求的资源了。打开输入流,通过IO流,接收服务器发送的资源.
		InputStream in=con.getInputStream();
		byte[] buffer=new byte[1024];
		int len=in.read(buffer,0,buffer.length);
		
		System.out.println("资源内容:"+new String(buffer,0,len,"UTF-8"));//把资源以字符串的形式输出
	}
}

执行结果:
访问百度首页
  我们看到,浏览器通过暗号告诉我们发送的资源类型是text/html文本。可以看到资源内容就是百度首页的源码。通过Java提供的IO流可以接受服务器发送的资源,但是我们的输出控制台只能显示这些文本(可能会乱码),而真正的浏览器可以把html文本配合JS等“翻译”成我们见到的飘飘亮亮的网页。
比如:
百度首页
但是可以说,我们已经实现了爬虫。即----通过代码模拟浏览器向服务器请求资源,接受浏览器返回的资源。

  Demo2
/**
 * 模拟浏览器发送请求,接收数据
 * @author luckyriver
 *
 */
public class URL_Demo {
	/**
	 * 以访问百度首页为例
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		//对应浏览器地址栏输入URL
		URL url=new URL("https://cn.bing.com/th?id=OHR.Montreux_ZH-CN5485205583_1920x1080.jpg&rf=LaDigue_1920x1080.jpg");//创建URL对象,相信大家已经知道了什么是URL,构造方法传入想要访问的URL

		//对应地址栏输入后点击连接
		URLConnection con=url.openConnection();//调用URL对象的openConnection()方法,字面意思,打开连接,获得连接对象

		String type=con.getContentType();//content-type是浏览器回应我们的“暗号的一部分”
		System.out.println("部分暗号:"+type);//

		//这时,对过暗号之后,就可以开始发送请求的资源了。打开输入流,通过IO流,接收服务器发送的资源.
		InputStream in=con.getInputStream();
		byte[] buffer=new byte[1024];
		int len=in.read(buffer,0,buffer.length);
		
		System.out.println("资源内容:"+new String(buffer,0,len,"UTF-8"));//把资源以字符串的形式输出
	}
}

  跟上面代码类似,只不过这次我们访问的URL变为必应首页的背景图
来看输出结果:
访问必应
  我们看到,服务器给我们的资源类型为image/jpeg,是图片资源,我们用字符串形式输出,肯定看不到图片,图片长这样
  那么我们如何得到这张图片呢?相信学过Java IO的你一定知道。
  我们今天通过简单的例子阐述了爬虫的基本原理,下次我们来讨论更多的例子。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值