HTTP协议
HTTP:
目前使用最广泛的Web应用程序使用的基础协议。
通过HTTP协议(超文本传输协议,是基于TCP协议之上的一种请求-响应协议)实现的。
当浏览器希望访问某个网站的时候,浏览器和网站服务器之间首先建立TCP连接。 然后,浏览器向服务器发送一个HTTP请求,服务器收到后,返回一个HTTP响应,并且在响应中包含了一个HTML的网页内容。这样,浏览器解析HTML后就可以给用户显示网页。一个完整的HTTP请求-响应如下:
**对图中的说明:**
第一行:请求方法 路径 HTTP版本
Host:表示请求的域名
User-Agent:表示客户端自身表示信息,服务器通过User-Agent判断客户端类型是IE还是Chrome、Firefox、还是一个Python爬虫。
Accept:表示客户端能处理HTTP响应格式。*/*任意格式
Accept-Language:表示客户端接受的语言。
HTTP请求的格式是固定的,它由HTTP Header和HTTP Body两部分构成。GET / HTTP /1.1 表示使用GET请求,路径是/ ,版本是HTTP/1.1.后续的每一行都是固定的Header:value格式,我们称为HTTP Header, 服务器通过某些特定的Header来识别客户端的请求。
GET请求: 表示HTTP请求只有HTTP Header,没有HTTP Body。
POST请求:都有。(通常是要设置Content-Type表示Body的类型,Content-Length表示Body的长度,这样服务器就可以根据请求的Header和Body做出正确地响应。)
代码实现:
以在网页端下载所有照片为例:
//获取地址(统一资源定位符)
URL douban = new URL("https://www.douban.com/");
// //打开连接
HttpURLConnection connection = (HttpURLConnection)douban.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//请求设置Header属性
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/8");
//
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),StandardCharsets.UTF_8));
String line = null;
while((line = reader.readLine())!=null) {
//去除空格
line = line.trim();
//判断当前行是否包含路径
if(line.startsWith("<img")&&line.contains("https://img")&& line.contains(".jpg")) {
System.out.println(line);
//使用jsoup解析html
//JSOUP类的作用进行原始解析
//Document类:网页文档(包含解析到的所有标签)
//Element类:若干元素Element形成的集合(继承自ArrayList)
//Element类:某一个html元素
//提取图片的路径src 电影名称alt
String src = "" ,alt ="";
//解析生成Document对象
Document doc= Jsoup.parse(line);
//从Document中获取名称为img的所有标签元素(Elements)
//从所有代表img的Elements元素集合中获取第一个
Element imgElement = doc.getElementsByTag("img").first();
//虎丘img标签元素src属性和alt属性
src = imgElement.attr("src");
alt = imgElement.attr("alt");
//读取图片
// URL image = new URL(src);
// HttpURLConnection connection = (HttpURLConnection)douban.openConnection();
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\img\\,,"+alt+".jpg"));
byte[] buff = new byte[1024];
int len = -1;
while((len = bis.read(buff))!=-1) {
bos.write(buff, 0, len);
}
}
}