python爬虫基础1(HTTP基本原理)

URI:全称为Uniform Resource Identifier,即统一资源标志符。

URL:全称为Universal Resource Locator,即统一资源定位符。

 

HTTP协议一般指HTTP(超文本传输协议),是一种用于分布式,协作式和超媒体信息系统的应用层协议,是因特网上应用最广泛的一种网络传输协议,所有的WWW文件都必须遵循这个标准。

HTTP是一种基于TCP/IP通信协议来传输数据(HTML文件,图片文件,查询结果等)

HTTP工作原理:

  • HTTP协议工作在客户端-服务器架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即Web服务器发送所有请求。
  • Web服务器有:Apache服务器,IIS服务器(Internet Information Services)
  • Web服务器根据接受到的请求后,向客户端发送响应信息。
  • HTTP默认端口号是80,但也可以修改为8080或其它端口。

HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

一个HTTP客户端是一个应用程序,通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。

一个HTTP服务器同样是一个应用程序,通过接受客户端的请求并向客户端发送HTTP响应数据。

HTTP使用统一资源标识符URI来传输数据和建立连接。

一旦建立连接后,数据消息就通过类似Internet邮件的格式来传送。

 

客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request  line),请求头(header),空行和请求数据四部分组成。

 

服务器响应消息

HTTP也由四个部分组成:状态行,消息报头,空行,响应正文。

 HTTP请求方法:

  1. GET:请求指定的页面信息并返回实体主体。
  2. Head:类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。
  3. Post:向指定资源提交数据并进行处理请求(例如提交表单或上传文件),数据被包含在请求体中,Post请求可能会导致新的资源的建立或已有资源的修改。
  4. Put:从客户端向服务器传送的数据取代指定的文档的内容。
  5. Delete:请求服务器删除指定的页面。
  6. Connect:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  7. Options:允许客户端查看服务器的性能。
  8. Trace:回显服务器收到的请求,主要用于测试或诊断。
  9. Patch:是对put方法的补充,用来对已知资源进行局部更新。

Allow

服务器支持哪些请求方法(如GET、POST等)。

Content-Encoding

文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

Content-Length

表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

Content-Type

表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。

Date

当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

Expires

应该在什么时候认为文档已经过期,从而不再缓存它?

Last-Modified

文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

Location

表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

Refresh

表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。

注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。

注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。

注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

Server

服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

Set-Cookie

设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。

WWW-Authenticate

客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。

注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。

请求头和响应头信息

  • 客户端请求
    • GET(请求方法)
    • /hello.txt URL
    • HTTP/1.1 HTTP版本
    • User-Agent:简称UA,user agent 用户代理,代表用户行为的软件代理程序提供的一个标识符。客户机通过这个头告诉服务器,客户机的软件环境。
    • Host:Host 是 HTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术。客户机通过这个头告诉服务器,想访问的主机名。
      • 虚拟主机(virtual hosting)即共享主机(shared web hosting),可以利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。
    • Accept-Language:告诉服务器,客户机的语言环境。浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
    • Accept:告诉服务器,客户端支持的数据类型
    • Accept-Encoding:告诉服务器,客户机支持的数据压缩格式。
    • Content-Length:表示请求消息正文的长度。
    • Connection:客户机通过这个头告诉服务器,请求完后是关闭还是保持链接。
    • Cookie:客户机通过这个头告诉服务器,可以向服务器带数据。
    • Content-Type:客户机通过这个头告诉服务器,客户端向服务器发送的数据类型。
    • Origin:用来说明请求从哪里发起的,包括且仅仅包括协议和域名。
      • 这个参数一般只存在于CORS跨域请求中,可以看到response有对应的header:Access-Control-Allow-Origin。
    • Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
    • Accept-Charset:告诉服务器,客户端采用的编码。
    • Date:客户机通过这个头告诉服务器,客户机当前请求时间。
    • If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。
  • 服务端响应
    • HTTP/1.1 HTTP版本
    • 状态码200:OK 一切正常,对GET和POST请求的应答文档跟在后面。
    • Date:Date头域表示消息发送的时间,缓存在评估响应的新鲜度时要用到,时间的描述格式由RFC822定义。告诉客户机,返回响应的时间(补充一点,GMT:格林威治时间)
    • Server:服务器通过这个头,告诉浏览器服务器的类型。
    • Last-Modified :文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。
    • ETag:被请求变量的实体值,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。与缓存相关的头。
    • Accept-Ranges:标识自身支持范围请求,返回值为 bytes,这代表了该服务器可以接受范围请求,如果该值为 none,则代表不允许范围请求。
    • Content-Length:用于描述HTTP消息实体的传输长度。服务器通过这个头,告诉浏览器回送数据的长度
    • Vary:Vary 字段用于列出一个响应字段列表,告诉缓存服务器遇到同一个 URL 对应着不同版本文档的情况时,如何缓存和筛选合适的版本。
    • Content-Type:服务器通过这个头,回送数据的类型。
    • Connection:服务器通过这个头,响应完是保持链接还是关闭链接。
    • Content-Encoding:服务器通过这个头,告诉浏览器数据采用的压缩格式。
    • Transfer-Encoding
      • HTTP协议头字段Transfer_Encoding,分块传输编码,一般出现在http的响应头中。该头字段存在与HTTP协议的1.1版本中,提供一种数据传输机制。
      • 通常http协议在传输数据时是整体一起发送的,数据体的长度由Content-Length字段指定,方便判断消息结束。
      • 服务器通过这个头,告诉浏览器数据的传送格式。
    • Location:这个头配合302状态码使用,告诉用户端找谁。
    • Content-Language:服务器通过这个头,告诉服务器的语言环境
    • Last-Modified:服务器通过这个头,告诉浏览器当前资源的缓存时间
    • Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次
    • Content-Disposition:服务器通过这个头,告诉浏览器以下载的方式打开数据。
    • Expires:服务器通过这个头,告诉浏览器把回送的数据缓存多长时间。-1或0不缓存。
    • Cache-Control和Pragma:服务器通过这个头,也可以控制浏览器不缓存数据

当浏览器访问一个网站时,浏览器会向网站所在的服务器发送请求,当浏览器接受并显示网页前,此网页的服务器会返回一个包含HTTP状态码的信息头用来响应浏览器的请求。

常见的状态码:

  • 200-请求成功
  • 301-资源(网页等)被永久转移到其它URL
  • 404-请求的资源(网页等)不存在
  • 500-内部服务器发生错误

HTTP状态码分类:HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,类型分为5种:

1**:信息,服务器收到请求,需要请求者继续执行操作

2**:成功,操作被成功接收并处理

3**:重定向,需要进一步的操作以完成请求

4**:客户端错误,请求包含语法错误或无法完成请求

5**:服务器错误,服务器在处理请求的过程中发生了错误

HTTP content-type

content-type(内容类型),一般指网页中存在的content-type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式,什么编码读取这个文件,就是经常看到一些PHP网页点击的结果是下载一个文件或一张图片的原因。

Content-Type 标头告诉客户端实际返回的内容的内容类型。

语法格式:

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

常见的媒体格式类型如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式
  • application/xml: XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/json: JSON数据格式
  • application/pdf:pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

部分转载于 来自 <HTTP 响应头信息 | 菜鸟教程>

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值