IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> HTTP编程(Java爬虫-简单爬取网页数据) -> 正文阅读

[网络协议]HTTP编程(Java爬虫-简单爬取网页数据)

HTTP协议简介

HTTP 是 HyperText Transfer Protocol 的缩写,翻译为超文本传输协议,它是基于 TCP 协议之上的一种请求-响应协议。

HTTP请求格式是固定的,由HTTP Header和 HTTP Body两部分构成。第一行通常由 请求方法/路径/HTTP版本:?GET / HTTP/1.1 分别一一对应.

后续由 Header:Value格式,我们称为HTTP Header.

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

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

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

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

?我们需要注意的是 GET请求,那么该HTTP请求只有HTTP Header,如果是POST请求,那么该HTTP请求带有BODY? ?

常见的JSON中POST请求? ? ?

POST /login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=hello&password=123456

其中Content-Type代表BODY类型,Content-Length 表示 Body 的长度。

HTTP 响应也是由 Header 和 Body 两部分组成,一个典型的 HTTP 响应如下:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 133251
<!DOCTYPE html>
<html><body>
<h1>Hello</h1>

响应的第一行总是 HTTP版本 响应代码 响应说明 :

例如, HTTP/1.1 200 OK 表示版本是 HTTP/1.1 ,响应代码是 200 ,响应说明是 OK 。客户端只依赖响应代码判断 HTTP 响应是否成功。 HTTP 有固定的响应

代码: 1xx:表示一个提示性响应,例如101表示将切换协议,常见于WebSocket连接;

2xx:表示一个成功的响应,例如200表示成功,206表示只发送了部分内容;

3xx:表示一个重定向的响应,例如301表示永久重定向,303表示客户端应该按指定路径重新发送请求;

4xx:表示一个因为客户端问题导致的错误响应,例如400表示因为Content-Type等各种原因导致的无效请求,404表示指定的路径不存在;

5xx:表示一个因为服务器问题导致的错误响应,例如500表示服务器内部故障,503表示服务器暂时无法响应。

HTTP编程

由于浏览器本质上也属于HTPP客户端,所以发送一个HTTP请求,接收服务器响应后,获得响应内容。只不过浏览器进行了渲染,所以我们可以用java获得响应内容。

以下是通过HTTP编程,获取指定网页中图片的代码实现

package com.my.hyz1;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class Demo03 {
	public static void main(String[] args) {
		try {
			URL imageUrl = new URL("https://movie.douban.com/");
			HttpURLConnection connect = (HttpURLConnection)imageUrl.openConnection();
			
			connect.setRequestMethod("GET");
			connect.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62");
			System.out.println("HTTP的连接类型是" + connect.getClass());
			try (BufferedReader br = new BufferedReader(
					new InputStreamReader(connect.getInputStream(), StandardCharsets.UTF_8));) {
				String line = null;
				while ((line = br.readLine()) != null) {
					line =line.trim();
					
					if(line.startsWith("<img")&&line.contains("https://img")&&line.contains(".jpg")) {
						String src="",alt="";
						//使用jsoup解析html 
						//document类包含解析html中的所有标签
						//elements若干元素elements形成的集合(继承 ArrayList)
						//element包含某一个html元素
						Document doc = Jsoup.parse(line);
						Element imgelElement = doc.getElementsByTag("img").first();
						//获取img中的src和alt属性
						src=imgelElement.attr("src");
						alt=imgelElement.attr("alt");
			
						URL url = new URL(src);
						HttpURLConnection imageUrlconnection = (HttpURLConnection)url.openConnection();// 读取图片
						try (BufferedInputStream bis = new BufferedInputStream(imageUrlconnection.getInputStream());
								BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\tupian11\\douban2\\"+alt+".jpg"));){
							byte[] buff = new byte[1024];//边读边写
							int len = -1;
							while((len=bis.read(buff))!=-1) {
								bos.write(buff,0,len);
							}
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:17:07  更:2022-07-20 19:19:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 12:43:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码