Python 与 http请求

本文详细介绍了HTTP的基本原理,包括URI与URL、超文本、HTTP与HTTPS等,并讲解了HTTP请求过程、会话和Cookies的管理。接着,讨论了Python中发起HTTP请求的方法,包括urllib库和requests库的使用,如urllib.request的Request类构建Headers、错误处理,以及requests库的GET、POST请求,文件上传、Cookies管理等。文章还涵盖了网页基础,如HTML、CSS和JavaScript,并探讨了代理和网页的结构与选择器。最后,提供了使用Python发起HTTP请求的高级技巧,如使用预处理请求(Prepared Request)进行HTTP基本认证。
摘要由CSDN通过智能技术生成

Python 与 http请求

文章目录

本文为<Python开发基础>系列文章中的一篇,系列目录:

  1. 系列目录
  2. Python 与 http请求
  3. Python 与 html解析
  4. Python 与 数据存储
  5. Python 与 网络爬虫
  6. Python 与 Web服务(待完成)

本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io,并同时发布到 CSDN。本人不保证 CSDN 排版正确,敬请访问 clownote 以获得良好的阅读体验。

HTTP 基本原理

URI & URL

简写 全名 中文 说明
URI Uniform Resource Identifier 统一资源标志符 对应着一个资源
URL Uniform Resource Locator 统一资源定位符 说明从哪里可以找到一个资源
URN Universal Resource Name 统一资源名称 说明一个资源的唯一名字

URI 包含着 URL 和 URN。

通常,我们使用的网址,就是一个URI,同时也是一个URL。

超文本

超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。

我们平时看到的网页的源代码使用 HTML 写出的,HTML 就是一种超文本。

HTTP & HTTPS

我们用URL访问资源需要指定使用的协议类型,协议就是URL地址一开始的那个字段。

协议 全称 说明
HTTP Hyper Text Transfer Protocol(超文本传输协议) 用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档
HTTPS Hyper Text Transfer Protocol over Secure Socket Layer(在SSL上的HTTP) 以安全为目标的 HTTP 通道,是 HTTP 的安全版

HTTPS 相较于 HTTP 有以下优点:

  • 建立一个信息安全通道来保证数据传输的安全。
  • 确认网站的真实性,凡是使用了 HTTPS 的网站,都可以通过点击浏览器地址栏的锁头标志来
    查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询。

HTTP 请求过程

我们在浏览器中输入网址,便显示出一个网页的过程实际上是:

  1. 浏览器向网站的服务器发送了一个请求;
  2. 服务器接收到这个请求后进行解析和处理;
  3. 服务器返回对应的响应;
  4. 浏览器对收到的响应解析;
  5. 浏览器将解析的结果显示出来,即最后我们看到的网页。

我们可以在 Chrome浏览器 的开发者工具的“Network”页面看到的一个条目就是一次 发送请求和接收响应 的过程。

Network的列 说明
Name 请求的名称,一般会将 URL 的最后一部分内容当作名称 。
Status 响应的状态码,这里显示为 200, 代表响应是正常的 。 通过状态码,我们可以判断发送了请求之后是杏得到了正常的响应 。
Type 请求的文梢类型 。 这里为 document,代表我们这次请求的是一个 HTML文档, 内容就是一些 HTML代码。
Initiator 请求源 。 用来标记请求是由哪个对象或进程发起的 。
Size 从服务器下载的文件和请求的资源大小 。 如果是从缓存中取得的资源,则该列会显示from cache。
Time 发起请求到获取响应所用的总时间 。
Waterfall 网络请求的可视化瀑布流 。

点击条目,我们将看到更加详细的请求、响应信息。

请求与响应

请求(Request)

请求,是由 客户端服务端 发出的。

请求分为4部分:

  • 请求方法(Request Method):常见的请求方法分为两种 GET 和 POST:

    • GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到(可能暴露敏感信息)。GET请求提交的数据最多只有 1024 字节。
    • POST 请求中的 URL 不包含数据,数据都是通过表单形式传输的,会包含在请求体中。POST方式没有大小限制(可以传文件)。
    • 我们输入一个网址,这是一个 GET 请求。
    • 其实还有一些其他的请求方法,可以参考 HTTP请求方法
  • 请求地址(Request URL):统一资惊定位符 URL,唯一确定我们想请求的资源。

  • 请求头(Request Headers):用来说明服务器要使用的附加信息,比较重要的信息有 Cookie、 Referer、 User-Agent:

    • Accept: 请求报头域,用于指定客户端可 接受哪些类型的信息
    • Accept-Language: 指定客户端可接受的 语言类型
    • Acceot-Encoding: 指定客户端可接受的 内容编码
    • Host: 指定 请求资源的主机 IP 和端口号,其内容为 请求 URL 的原始服务器或网关的位置
    • Cookies: 网站为了辨别用户进行会话跟踪而 存储在用户本地的数据。它的主要功能是 维持当前访问会话,如检查用户登录。
    • Referer: 此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相 应的处理,如做来源统计、防盗链处理等 。
    • User-Agent: 简称 UA,它可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。 在做爬虫时加上此信息,可以伪装为浏览器; 如果不加,很可能会被识别州为爬虫 。
    • Content-Type: 也叫互联网媒体类型( Internet Media Type )或者 MIME类型,在 HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。
  • 请求体(Request Body):

    • POST 的请求体是表单数据;
    • GET 的请求体为空;

响应(Response)

响应,由 服务端 返回给 客户端

  • 响应状态码(Response Status Code):表示服务器的响应状态
    • HTTP状态码分类,具体HTTP状态码列表,见HTTP状态码
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
  • 响应头(Response Headers): 响应头包含了服务器对请求的应答信息

    • Date: 标识 响应产生的时间
    • Last-Modified: 指定 资源的最后修改时间
    • Content-Encoding: 指定响应 内容的编码
    • Server: 包含 服务器的信息,比如名称、版本号等
    • Content-Type: 文档类型,指定 返回的数据类型 是什么(和 Request 的一样)
    • Set-Cookie: 设置 Cookies。告诉浏览器需要将此内容放在 Cookies 中, 下次请求携带 Cookies 请求
    • Expires: 指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。
  • 响应体(Response Body)响应的正文数据都在响应体中

    • 请求网页时,它的响应体就 是网页的 HTML代码
    • 请求一张图片时, 它的响应体就是图片的二进制数据
    • 我们做爬虫请求网页后,要解析的内容就是响应体

会话 和 Cookies

HTTP 本身是无状态的,这是指 HTTP 协议对事物的处理是没有记忆能力的。
换言之,服务器 不知道 客户端是说明状态。

然而,我们日常接触的很多网页都可以实现用户登录等需要服务器记住客户端的操作。
实现这一类操作,就会用到 会话Cookies

会话

会话,是一系列有始有终的动作/消息。例如,从拿起电话拨号到挂断 电话这中间的一系列过程可以称为一个会话。

在 Web 中,会话对象 用来存储特定用户会话所需的属性及配置信息。

当用户在应用程序的 Web 页之间跳转时,存储在会话对象中的变量将不会丢失(如用户的登录状态);
当用户请求来自应用程序的 Web 页时如果该用户还没有会话,则服务器将自动创建一个会话对象 ;
当会话过期或被放弃后,服务器将终止该会话;

Cookies

Cookies指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。

服务器可以通过 Cookies 得知 那个客户端对应着那个会话、那个用户。
客户端Cookies服务端会话 的协作下,我们便可以实现会话的维持。

Cookie有如下几个属性 :

  • Name: 该 Cookie 的名称。一旦创建,该名称便不可更改。

  • Value: 该 Cookie 的值。

    • 如果值为 Unicode 字符,需要为字符编码。
    • 如果值为二进制数据,则需要使用 BASE64 编码。
  • Domain: 可以访问该 Cookie的域名。例如,如果设置为 .zhihu.com,则所有以 zhihu.com 结尾的域名都可以访问该 Cookie。

  • MaxAge: 该 Cookie失效的时间,单位为秒,也常和 Expires 一起使用,通过它可以计算有效时间。

    • MaxAge 如果为正数,则该Cookie在MaxAge秒之后失效。
    • 如果为负数,则关闭 浏览器时 Cookie 即失效,浏览器也不会以任何形式保存该 Cookie。
  • Path : 该 Cookie 的使用路径。
    如果设置为 /path/,则只有路径为 /path/ 的页面可以访问该 Cookie。
    如果设置为 / 则本域名下的所有页面都可以访问该 Cookie。

  • Size字段: 此 Cookie 的大小。

  • HTTP 字段: Cookie 的 httponly 属性。

    • 若此属性为 true,则只有在 HTTP 头中会带有此 Cookie的信息,而不能通过 document.cookie来访问此 Cookie。
  • Secure: 该 Cookie 是否仅被使用安全协议传输。安全协议有 HTTPS 和 SSL 等,在网络上传输数据之前先将数据加密。默认为 false。

代理

在我们正常请求一个网站时,我们直接把请求发给了Web服务器,Web服务器又直接把响应回传给我们。

而如果我们使用 代理服务,就等于是多了一个中间人,即代理服务器,这个过程变成了:
我们直接把请求发给 代理服务器,代理服务器 把响应回传给 代理服务器,代理服务器再把这个消息传给我们。

通过代理,我们就可以伪装IP,防制在爬虫时被查出来封IP或事需要提供验证码,影响爬虫运行。

⚠️【注意】并不是所有的 代理 都可以让我们隐藏 IP!
有的 代理服务 会在向 web服务器 的请求 时,不会原封不动的转发我们的消息,而是在其中添加上我们的真实IP等信息,这时就隐藏不了了。

网页基础

网页分为三大部分 ———— HTML(框架),CSS(样式),JavaScript(逻辑)。

HTML, 超文本标记语言

详见 HTML 教程

CSS, 层叠样式表

详见 CSS 教程

JavaScript, 脚本语言

详见 JavaScript 教程

网页结构

在 HTML 中,所有标签定义的内容都是节点,它们构成了一个 HTML DOM 树。(DOM:文档对象模型)
通过 HTML DOM,树中的所有节点均可通过 JavaScript访问,所有 HTML 节点元素均可被修改,也可以被创建或删除 。

详见 HTML DOM 教程

选择器

在 css 中,我们使用 css 选择器来定位节点。

详见 CSS 选择器表

用 Python 发起 HTTP 请求

urllib

urllib 是 Python 内置的 HTTP 请求库。

urllib 有 request,error,parse,robotparser 四个模块。

urllib.request 发送请求

urlopen(): 发送请求
# 获取 python 官网 HTML 源码
import urllib.request

response = urllib.request.urlopen('https://www.python.org')

print(response.read().decode('utf-8'))  # 查看response内容
print(type(response))                   # 查看response类型
print(response.status)                  # 查看response状态码
print(response.getheaders())            # 查看响应头
print(response.getheader('Server'))     # 查看特定的响应头项

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

urlopen()data 参数: 用 POST 发送一些数据
import urllib.parse
import urllib.request

data = bytes(
    urllib.parse.urlencode({
   'Hello': 'World'}),
    encoding='utf-8'
    )
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read().decode('utf-8'))
urlopen()timeout 参数: 如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常。

设置timeout=Sec,Sce 为超时的秒数(可以为小数)。

import socket
import urllib.request

try:
    response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
except Exception as e:
    print(e)
        
print(response.read().decode('utf-8'))
Request 类构建 Headers

利用更强大的 Request类来构建一个完整的请求。

import urllib.request

request = urllib.request.Request('http://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
Request类 的构建参数

class urllib.reque

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值