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解码
相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习