Python urllib、requests、HTMLParser

HTTP协议

HTTP 协议:一般指HTTP(超文本传输)协议。

HTTP是为Web浏览器和Web服务器之间的通信而设计的,基于TCP/IP通信协议嘞传递数据。

HTTP消息结构

客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式

  • 请求行(request line)
  • 请求头(header)
  • 空行
  • 请求数据

服务器相应消息

HTTP相应也由四个部分组成

  • 状态行
  • 消息报头
  • 空行
  • 响应正文

HTTP响应头信息

HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。

以下是一些例子

  • Allow 服务器支持哪些请求方法
  • Connect-Encoding 文档的编码方法
  • Connect-Length 表示内容长度
  • Connect-Type 表示后面的文档属于什么MIME类型。
    • 该属性用于定义网络文件的类型和网页的编码 例如Connect-Type: text/html; charset=utf-8
    • MIME类型:描述消息内容类型的标准。通用结构type/subtype
  • Date 当前的GMT(格林威治标准时间)时间

HTTP请求方法

HTTP请求方法有很多种,其中1.0版本有 GET、POST、HEAD三种,1.1版本又新增了六种。

  • GET:请求指定的页面信息,并返回实体主体
  • HEAD:类似于GET请求,只不过返回的响应中没有具体内容,用于获取报头
  • POST:向指定资源提交数据进行处理请求。数据被包含在请求体中。请求可能导致新的资源的建立或已有资源的修改。

HTTP状态码

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,共五类。

  • 1xx:信息,服务器收到请求,需要操作者继续执行操作
  • 2xx:成功,操作被成功接收并处理
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务器错误

urllib 示例

urllib发送get请求

直接上代码,urllib发送get请求

python 复制代码
from urllib import request

with request.urlopen('http://httpbin.org/get') as f:
    data = f.read()    #f.read()返回响应正文

#print(data.decode('utf-8'))
#直接输出结果,需要解码

#输出结果到文件
with open('get_response.text', 'wb') as f:
    f.write(data)

最简单的发送get请求的方法,使用openurl函数,尽管这个函数能实现的功能较为有限。
http://httpbin.org/get可以帮助学习如何发送get请求。响应的正文包含了get请求的相关信息。
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭/线程中锁的自动获取和释放等。

以下是响应的正文部分:

json 复制代码
{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.12", 
    "X-Amzn-Trace-Id": "Root=1-65d7213d-6d15d2b651139df358d943b7"
  }, 
  "origin": "42.229.145.105", 
  "url": "http://httpbin.org/get"
}

该网址返回的正文是请求的响应信息

  • args可以通过url直接带入:http://httpbin.org/get?name=Bob&job=teacher
  • headers请求头中可以看出,User-Agent就是我们使用的库函数,一些网站需要将User-Agent指定为常用的浏览器。
    若要添加请求头,则需要用到urllib.Request()类。

requests库

requests库是基于python开发的HTTP库,与urllib标准库相比,代码要简洁。实际上,requests库是在urllib的基础上进行了高度封装。

使用requests库来发送HTTP请求更加简便。

get请求

python 复制代码
import requests

#设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
}

#传入参数时,可以利用params关键字传入,接收字典类型,与直接在url加入参数效果相同。
#使用post方法时,利用data关键字接收参数。

r = requests.get('https://baidu.com', headers = headers)

#基本属性
print(type(r))
#响应对象类型  <class 'requests.models.Response'>
print(r.status_code)
#响应状态码  200
print(r.cookies)
#查看cookies  <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
print(r.headers)
#查看响应头
print(r.url)
#url

#响应正文内容
print(r.text)  #相应内容(str)
print(r.content)  #响应内容(bytes)  可以用decode解码
相关推荐
茯苓gao2 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾2 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT3 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa3 小时前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落4 小时前
Python学习之装饰器
开发语言·python·学习
speop5 小时前
llm的一点学习笔记
笔记·学习
非凡ghost5 小时前
FxSound:提升音频体验,让音乐更动听
前端·学习·音视频·生活·软件需求
ue星空5 小时前
月2期学习笔记
学习·游戏·ue5
萧邀人5 小时前
第二课、熟悉Cocos Creator 编辑器界面
学习
m0_571372826 小时前
嵌入式ARM架构学习2——汇编
arm开发·学习