基于HTTP协议以及TCP协议实现的简单网络爬虫


             HTTP(Hype Text Transfer Protocol)协议又叫做超文本传输协议,是目前使用最广泛的Web应用程序使用的基础协议,像APP访问后台服务器或者浏览器访问网站,都是通过HTTP协议实现的,它是基于TCP协议之上的一种请求-响应协议。

        

当我们使用浏览器访问模拟服务器时,控制台会获取当前连接的信息,也就是请求头HTTP Header和请求体Body:

Host:表示请求的域名,因为一台服务器上可能有多个网站,因此有必要依靠Host来识别请求是发给哪个网站的;

User-Agent:表示客户端自身标识信息,不同的浏览器有不同的标识,服务器依靠User-Agent判断客户端类型是IE还是Chrome,是Firefox还是一个爬虫;

 Accept:表示客户端能处理的HTTP响应格式,*/*表示任意格式,text/*表示任意文本,image/png表示PNG格式的图片;

 Accept-Language:表示客户端接收的语言,多种语言按优先级排序,服务器依靠该字段给用户返回特定语言的网页版本。

        这里先爬取一个简单的海报图片,具体步骤如下:

1、先通过浏览器工具得到你想要爬取的图片的URL

2、建立HTTP连接请求,打开连接

3、设置请求方式(某些情况下可以不设置)

4、设置请求的属性,User-Agent(设置User-Agent是为了防止服务器认为我们是爬虫程序,从而拒绝服务)

5、通过输入输出流,一边读,一边将内容写到磁盘上。

实例代码如下:

public class DataFetch2 {
	public static void main(String[] args) {
		// 爬取一张豆瓣海报
		
		try {
           // 通过浏览器工具得到图片URL
			URL url = new URL("https://****************************************");
			
			// 建立HTTP请求,打开连接
			HttpURLConnection connection = (HttpURLConnection)url.openConnection();
			
			// 设置请求方式
			connection.setRequestMethod("GET");
			
			// 设置请求Header属性
			connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
			
			// 读取图片字节流信息
			try(BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
					// 写入图片信息
					BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IOTest\\doubanPicture\\图片.jpg"));	
					){
            // 常规以流的方式读取
			int len;
			byte[] buf = new byte[1024];
			while((len = bis.read(buf)) != -1) {
				bos.write(buf,0,len);
			}
			}
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		}
}

爬取结果:


当然也可以爬取多块内容

Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容,它提供了一套非常省力的API,可通过DOM,CSS以及类似与jQuery的操作方法取出和操作数据。

简而言之:Jsoup就是一个第三方的jar包,可以帮助我们很方便的实现爬虫。

主要功能:

从一个URL,文件或字符中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;

爬取海报图片源码:

public class DataFetch05 {
	public static void main(String[] args) {
		try {
			// 电影首页URL
			URL movieHomeUrl = new URL("https://movie.douban.com/");
			
			// 打开连接
			HttpURLConnection connection =  (HttpURLConnection)movieHomeUrl.openConnection();
			
			// 设置请求方式GET
			connection.setRequestMethod("GET");
			
			// 设置请求Header属性
			connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
			
			BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),StandardCharsets.UTF_8));
			String line = null;
			StringBuilder imgSb = new StringBuilder();
			while((line = reader.readLine()) != null) {
				// 去除该行空格
				line = line.trim();
				
				// 判断当前行是否包含海报图片路径
				if(line.startsWith("<img") 
						&& line.contains("https://img") 
						&& line.contains(".jpg")) {
					imgSb.append(line);
				}
			}
            // 转换成String类型
			String str = imgSb.toString();
		
			
			// 解析成Document对象
			Document doc = Jsoup.parse(str);
			
			// 从Document中获取名称为img的所有标签元素(Elements)
			Elements s = doc.getElementsByTag("img");
			
			// 从所有代表img的Elements元素集合中遍历
			for (int i = 0; i < s.size();i++) {
				Element ele = s.get(i);
				String src = ele.attr("src");
				String alt = ele.attr("alt");
	
				// 读取图片
				URL imageUrl = new URL(src);
				HttpURLConnection imageUrlConnection = (HttpURLConnection)imageUrl.openConnection();
				try (BufferedInputStream in = new BufferedInputStream(imageUrlConnection.getInputStream());
					BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("D:\\IOTest\\doubanPicture\\"+alt+".jpg"));){
					
					// 边读边写
					byte[] buff = new byte[1024];
					int len = -1;
					while((len = in.read(buff)) != -1) {
						out.write(buff,0,len);
					}
			}
			
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (ProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
					
	}
}

爬取结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值