Day 27:【99天精通Python】HTTP协议与Requests库 - 爬虫与API的敲门砖

Day 27:【99天精通Python】HTTP协议与Requests库 - 爬虫与API的敲门砖

前言

欢迎来到第27天!

在昨天的课程中,我们用 Socket 写了一个简易的聊天程序。虽然很酷,但你有没有发现:为了发一句 “Hello”,我们写了几十行代码,还要处理复杂的粘包、断开连接等底层问题。

在当今的互联网世界,90% 以上的数据传输都建立在HTTP 协议之上(比如浏览网页、刷手机APP、调用API接口)。如果我们每次都用 Socket 去手写 HTTP 报文,那得累死。

Python 之所以被称为"爬虫神器"和"胶水语言",很大程度上归功于一个第三方库——Requests。它的口号是“HTTP for Humans”(给人类用的 HTTP 库)。今天,我们就来学习如何用最优雅的姿势上网。

本节内容:

  • HTTP 协议基础 (请求与响应)
  • Requests 库安装与入门
  • 发送 GET 和 POST 请求
  • 伪装请求头 (User-Agent)
  • 处理响应数据 (文本、JSON、图片)
  • 实战练习:下载图片与调用 API

一、HTTP 协议:互联网的快递单

在写代码前,我们得先看懂浏览器是怎么工作的。

当你在浏览器输入www.baidu.com并回车时,实际上发生了一次请求 (Request)响应 (Response)的对话。

1.1 请求 (Request)

浏览器发给服务器的"快递单",包含:

  1. 方法 (Method)
    • GET: 我要拿数据 (如浏览网页)。
    • POST: 我要提交数据 (如登录、发帖)。
  2. URL: 目标地址。
  3. 请求头 (Headers): 附加信息 (我是什么浏览器、我能看懂中文等)。
  4. 请求体 (Body): POST请求时携带的具体数据。

1.2 响应 (Response)

服务器回给你的包裹,包含:

  1. 状态码 (Status Code):
    • 200: 成功 (OK)。
    • 403: 禁止访问 (Forbidden)。
    • 404: 找不到资源 (Not Found)。
    • 500: 服务器崩了 (Server Error)。
  2. 响应头 (Headers): 数据类型、长度等。
  3. 响应体 (Body): 具体的 HTML 网页代码、图片二进制数据或 JSON 数据。
Web服务器浏览器/PythonWeb服务器浏览器/Python带上 User-Agent返回 HTML 内容GET /index.html (Request)处理请求...200 OK (Response)

二、Requests 库初体验

Requests 是第三方库,需要先安装:

pipinstallrequests

2.1 最简单的 GET 请求

importrequests# 1. 发送请求url="https://www.baidu.com"response=requests.get(url)# 2. 查看状态码print(f"状态码:{response.status_code}")# 200# 3. 设置编码 (防止中文乱码)response.encoding="utf-8"# 4. 获取网页源代码 (文本)print(response.text[:100])# 打印前100个字符

三、发送带参数的请求

3.1 GET 请求带参数 (params)

比如我们在百度搜索 “Python”,URL 会变成baidu.com/s?wd=Python

# 不用手动拼 URL,requests 会自动处理params={"wd":"Python","ie":"utf-8"}resp=requests.get("https://www.baidu.com/s",params=params)print(resp.url)# 输出: https://www.baidu.com/s?wd=Python&ie=utf-8

3.2 POST 请求带数据 (data/json)

模拟表单提交(如登录)。

data={"username":"admin","password":"123"}# 表单提交 (application/x-www-form-urlencoded)resp=requests.post("http://httpbin.org/post",data=data)# JSON 提交 (application/json)resp_json=requests.post("http://httpbin.org/post",json=data)

四、伪装自己:请求头 (Headers)

很多网站有反爬虫机制,如果发现你是 Python 程序(默认 User-Agent 是python-requests/x.x),会直接拒绝访问(返回 403)。
我们需要把自己伪装成浏览器。

headers={# 这是一个 Chrome 浏览器的 User-Agent"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}resp=requests.get("https://www.douban.com",headers=headers)print(resp.status_code)# 如果不加 headers 可能是 418 或 403,加上后是 200

五、处理响应内容

服务器返回的数据不一定是文本,还可能是图片、视频或 JSON。

5.1 获取 JSON 数据

调用 API 接口时,返回的通常是 JSON。

# GitHub 的公开 APIurl="https://api.github.com/events"resp=requests.get(url)# 自动解析 JSON 为 Python 列表/字典data=resp.json()print(f"最近一条动态类型:{data[0]['type']}")

5.2 获取二进制数据 (下载图片)

图片、音频、视频都是二进制数据,存储在response.content中。

img_url="https://www.python.org/static/img/python-logo.png"resp=requests.get(img_url)# 保存图片withopen("python_logo.png","wb")asf:f.write(resp.content)print("图片下载成功!")

六、实战练习

练习1:简易网页采集器

编写一个程序,让用户输入一个关键词,程序自动去百度搜索,并将搜索结果页面的 HTML 保存到本地result.html中。

importrequestsdefbaidu_search(keyword):url="https://www.baidu.com/s"headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"}params={"wd":keyword}try:resp=requests.get(url,params=params,headers=headers)ifresp.status_code==200:filename=f"{keyword}_result.html"withopen(filename,"w",encoding="utf-8")asf:f.write(resp.text)print(f"搜索结果已保存至{filename}")else:print(f"请求失败,状态码:{resp.status_code}")exceptExceptionase:print(f"发生错误:{e}")# baidu_search("Python教程")

练习2:IP地址查询 (调用 API)

使用免费的 IP 查询接口(如http://ip-api.com/json/),查询本机或者指定 IP 的地理位置信息。

importrequestsdefget_ip_info(ip=""):# 如果 ip 为空,接口默认查询本机url=f"http://ip-api.com/json/{ip}"try:resp=requests.get(url)data=resp.json()ifdata['status']=='success':print(f"IP:{data['query']}")print(f"国家:{data['country']}")print(f"城市:{data['city']}")print(f"ISP:{data['isp']}")else:print("查询失败")exceptExceptionase:print(f"网络错误:{e}")# get_ip_info() # 查本机# get_ip_info("8.8.8.8") # 查 Google DNS

七、常见问题

Q1:超时了怎么办?

网络请求可能因为各种原因卡死。建议总是加上timeout参数。

# 3秒连不上就报错requests.get(url,timeout=3)

Q2:SSL 证书验证错误?

访问 https 网站有时会报SSLError。可以设置verify=False忽略验证(不推荐在生产环境用)。

requests.get("https://unsafe-site.com",verify=False)

Q3:如何保持登录状态?

使用requests.Session()。它会自动在多次请求之间保持 Cookies。

s=requests.Session()s.post("http://site.com/login",data=login_data)# 第一次请求登录s.get("http://site.com/profile")# 第二次请求会自动带上 Cookie

八、小结

Requests 库

发送请求

请求参数

处理响应

requests.get()

requests.post()

params (URL参数)

data (表单) / json (JSON)

headers (伪装UA)

timeout (超时)

resp.status_code

resp.text (字符串)

resp.content (二进制/下载)

resp.json() (API解析)

关键要点

  1. Requests是 Python HTTP 操作的首选库。
  2. 爬虫第一步:记得加User-Agent伪装。
  3. resp.text看网页源码,resp.content下载图片,resp.json()读接口数据。

九、课后作业

  1. 壁纸下载器:找到一个提供随机图片的 API(如https://picsum.photos/200/300),循环下载 5 张图片并保存到本地images文件夹中。
  2. 天气查询工具:寻找一个免费的天气 API,编写程序输入城市名,输出该城市当前的天气情况。
  3. 状态检查员:有一个网站列表urls = ["baidu.com", "google.com", "qq.com"],循环检测它们是否能正常访问(状态码200),并打印耗时。

下节预告

Day 28:HTML 解析库 BeautifulSoup- 拿到了网页源码(全是 HTML 标签)怎么提取里面的文字和链接?别用正则硬啃了,用 BeautifulSoup 像喝汤一样简单!


系列导航

  • 上一篇:Day 26 - 网络编程入门
  • 下一篇:Day 28 - HTML解析库BeautifulSoup(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1150806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一个C++知识点|const 和 constexpr 的区别

在程序开发中,由于代码复杂度大或者程序员的疏忽,以及函数参数传递中的无意识修改,都会导致数据意外修改的风险。为了解决这个问题,出现了类型限定符。其中,C的主要类型限定符是 const 和 constexpr 两种。 那么 const…

什么是天猫国际品牌代理运营?一般代运营提供哪些服务?

在全球化电商浪潮的推动下,天猫国际平台成为众多海外品牌进入中国市场的重要通道。然而,海外品牌在进入中国市场时,往往面临着文化差异、运营规则不熟悉、市场推广困难等诸多挑战。天猫国际品牌代理运营作为一种专业的电商服务模式&#xff0…

screen命令在断网环境下的调试应用操作指南

断网不断程:用screen构建高可用远程调试环境你有没有过这样的经历?深夜正在远程烧录固件,眼看着进度条走到 90%,突然 Wi-Fi 切换、4G 信号丢失,SSH 连接一断,终端里的任务瞬间“消失”。刷新会话后发现&…

[特殊字符]_Web框架性能终极对决:谁才是真正的速度王者[20260112172541]

作为一名拥有10年开发经验的全栈工程师,我经历过无数Web框架的兴衰更替。从早期的jQuery时代到现在的Rust高性能框架,我见证了Web开发技术的飞速发展。今天我要分享一个让我震惊的性能对比测试,这个测试结果彻底改变了我对Web框架性能的认知。…

超详细版LVGL教程:从零实现家居主界面

从零打造一个智能家居主界面:LVGL实战全记录最近在做一个家庭中控屏的项目,客户想要一块能控制全屋灯光、空调和安防系统的触摸面板。这事儿听起来简单,但真上手才发现——图形界面这东西,不光是“画几个按钮”那么简单。尤其是用…

深耕香港会计服务领域 香港卓信会计打造企业注册一站式解决方案

作为连接内地与国际市场的核心枢纽,香港凭借国际化金融环境与规范化商业体系,成为企业出海布局的重要据点。在此背景下,深耕香港财税服务领域的卓信会计服务有限公司(ZHUOXIN ACCOUNTING SERVICE LIMITED)凭借扎实的合…

RealMem: 重新定义AI的“长期记忆”,挑战真实场景交互

AI Agent 真的准备好成为你的长期合作伙伴了吗?你有没有这样的经历:在使用chatgpt等AI Assistant时,不断进行这两种动作:“新建聊天页”和“寻找过去的某个聊天页继续问”。为什么需要新建聊天页?因为一个会话上下文太…

天猫TP公司是什么意思?一般提供哪些服务?

在电商行业的发展进程中,天猫平台作为国内领先的电商巨头,吸引了众多品牌和商家的入驻。为了帮助品牌方更好地运营天猫店铺,提高店铺的竞争力和业绩,天猫TP公司应运而生。天猫TP公司凭借其专业的运营能力和丰富的资源优势&#xf…

手把手教程:Elasticsearch下载与Logstash环境搭建

从零搭建日志处理流水线:Elasticsearch 安装与 Logstash 配置实战 你有没有遇到过这样的场景?线上服务突然报错,几十台服务器的日志分散在各个角落,翻查起来像大海捞针。运维人员熬夜 grep 文件、开发团队反复复现问题——这背后…

MDK与工业自动化集成:系统学习手册

MDK与工业自动化集成:从代码到产线的实战指南你有没有遇到过这样的场景?一个工业控制项目,团队里有人写MCU固件,有人做上位机通信,还有人负责PLC逻辑。结果到最后联调时,发现采样周期对不上、Modbus寄存器偏…

【AI机器视觉】MediaPile和YOLO对比

MediaPipe 是 Google 开源的一个用于构建实时多媒体机器学习应用的框架。它的强大之处在于,将复杂的机器学习模型(如手部关键点检测、人体姿态估计、人脸网格识别等)封装成了简单易用的 API,支持多语言多平台,让开发者…

解析USB3.0接口定义引脚说明中的盲埋孔使用技巧

从USB3.0引脚定义看高速PCB设计:盲埋孔为何是信号完整性的“隐形推手”?你有没有遇到过这样的情况?明明严格按照USB3.0规范布线,差分对也做了等长匹配,参考平面也没分割——可测试时眼图就是打不开,误码率居…

Java Web 智能物流管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着电子商务和全球化贸易的快速发展,物流行业在供应链管理中的重要性日益凸显。传统物流管理系统存在信息孤岛、效率低下、数据实时性差等问题,难以满足现代企业对智能化、高效化物流管理的需求。智能物流管理系统通过整合物流资源、优化配送路径、…

[特殊字符]_高并发场景下的框架选择:从性能数据看技术决策[20260112170745]

作为一名经历过无数生产环境考验的资深工程师,我深知在高并发场景下选择合适的技术栈是多么重要。最近我参与了一个日活千万级的电商平台重构项目,这个项目让我重新思考了Web框架在高并发环境下的表现。今天我要分享的是基于真实生产数据的框架性能分析&…

USB3.0接口引脚定义详解:从基础到应用完整指南

USB3.0引脚设计全解析:从物理连接到高速通信的底层逻辑你有没有遇到过这样的情况?插上一个USB3.0移动硬盘,理论速度应该轻松突破400MB/s,结果拷贝大文件时却只有几十兆——慢得像在用十年前的老设备。问题很可能不在硬盘本身&…

Elasticsearch客户端集成:应用层对接实战案例

Elasticsearch客户端集成实战:从连接到高可用的全链路设计最近在重构公司日志平台时,又一次深度踩进了Elasticsearch 客户端集成的“坑”。虽然 ES 本身功能强大,但真正让系统稳定跑起来的,其实是应用层那个看似简单的es客户端。用…

微服务分布式SpringBoot+Vue+Springcloud人口老龄化社区活动老年人服务和管理平台

目录摘要开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着人口老龄化趋势加剧,社区养老服务需求日益增长。传统服务模式存在效率低、资源分散、信息孤岛等问题,亟需通过数字化手段优化管理流程。…

Java Web 电影评论网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着互联网技术的快速发展和数字化娱乐的普及,电影评论网站逐渐成为观众分享观影体验、交流观点的重要平台。传统的电影评论系统在功能扩展性、用户体验以及数据处理效率方面存在诸多不足,难以满足现代用户对互动性和实时性的需求。因此&#xff0c…

UDS多帧传输与流控策略在车内通信的应用

UDS多帧传输与流控策略:如何让车载通信“既快又稳”?你有没有想过,一辆智能汽车在做OTA升级时,成千上万字节的固件数据是怎么通过一根带宽只有500kbps的CAN总线安全送达ECU的?更神奇的是,为什么低端MCU不会…

Day 28:【99天精通Python】HTML解析库 BeautifulSoup - 像喝汤一样提取网页数据

Day 28:【99天精通Python】HTML解析库 BeautifulSoup - 像喝汤一样提取网页数据 前言 欢迎来到第28天! 在昨天的课程中,我们学会了用 requests 库把网页源代码(HTML)下载下来。但是,打印出来的 response…