当前位置:首页>python>python请求库(requests 与 aiohttp)

python请求库(requests 与 aiohttp)

  • 2026-10-01 20:28:42
python请求库(requests 与 aiohttp)

Python 爬虫系列 · Day 7

py请求库(requests 与 aiohttp)

GET/POST · Session · 异步爬虫 · 反爬对抗 · 选型指南

系列导航(20+ 天)

   ✓ Day1 职业规划 | ✓ Day2 基础语法(上) | ✓ Day3 基础语法(下) | ✓ Day4 HTTP 协议 | ✓ Day5 TCP/IP | ✓ Day6 数据存储 | ▶ Day7 请求库 | ...   

一、requests — 爬虫的瑞士军刀

面试官开场必问:用 requests 写过爬虫吗?说说基本用法。 这题不是考你会不会写,是考你用得熟不熟练、有没有踩过坑。GET 和 POST 是地基,参数和 Headers 是砖墙。

操作写法面试要点
GET
requests.get(url, params=...)
参数走 params,不用自己拼 URL
POST
requests.post(url, data/json=...)
表单用 data,JSON 用 json=
Headers
headers={'User-Agent': ...}
不带 UA 的请求 = 直接告诉服务器"我是爬虫"
Cookies
cookies={'session': ...}
登录态全靠它,但手动管 Cookie 很累
超时
timeout=10
不设超时 = 可能永远卡住

面试坑点:面试官问"GET 和 POST 有什么区别?" 不要答"GET 不能发 body" — HTTP 规范没禁止,只是不规范。正确答法:语义不同:GET 幂等(重复请求结果不变),POST 不幂等。爬虫视角:GET 参数暴露在 URL 里,POST 在 body 里 — 翻页一般用 GET,提交表单用 POST。

二、Session — 为什么别用裸 requests

高频考点,也是区分"写过爬虫"和"写过生产级爬虫"的分水岭。裸 requests.get() 每次都新建 TCP 连接、不管 Cookie。 Session 对象做了两件事:复用连接 + 自动管 Cookie。

对比项裸 requests.get()session.get()
TCP 连接
每次新建(3 次握手)
复用连接(keep-alive)
Cookie
每次手动传
自动保持
速度
慢(反复握手)
快 30%-50%

一句话记忆:面试官问"为什么用 requests.Session?" 标准答案两个点:① 复用 TCP 连接减少握手开销提升速度;② 自动管理 Cookie 保持登录态。 这和 Day5 TCP/IP 那篇的连接复用是同一条线 — 基础和实战串起来了。

三、aiohttp — 异步爬虫的发动机

面试官进阶题:requests 爬 100 个页面要 50 秒,怎么提速? 答案就是异步。requests 是同步的 — 发一个请求等响应回来才能发下一个,中间 CPU 空等。aiohttp 配合 asyncio,等 A 响应的时候同时去发 B 和 C。

对比requests(同步)aiohttp(异步)
执行模型
串行:发一个等一个
并发:发一批等一批
100 页耗时
约 50s
约 3-5s
并发上限
多线程(受 GIL 限制)
单线程协程(无 GIL 瓶颈)
学习成本
低(API 简单)
高(async/await)

面试加分点:能说出 Python GIL(全局解释器锁)的人不多。GIL 限制了多线程不能真正并行执行 Python 字节码,所以多线程爬虫提升有限。asyncio 是单线程协程,不靠多线程,靠事件循环切换任务 — 在 IO 等待时自动切换到下一个任务,绕过了 GIL。答出"GIL"和"事件循环",面试官就知道你是真懂异步。

四、反爬对抗 — requests 进阶技巧

面试官追问:服务器封你了怎么办? 三个手段:UA 伪装、代理 IP、超时重试。三个都会就是合格爬虫工程师。

手段原理难度
UA 伪装
每次请求换不同 User-Agent,伪装成不同浏览器
简单
代理 IP
proxies={'http': 'ip:port'} 换 IP 发请求,封一个换一个
中等
超时重试
timeout + try/except + 循环重试,或者用 retry 装饰器
简单

面试坑点:面试官问"代理 IP 池怎么维护?" 不要只说"买一批代理 IP"。标准答法:用 Redis 维护代理池 — 可用代理存 Set,失效代理自动剔除,定时检测可用性打分排序。 这又串上了 Day6 的 Redis 知识。

五、选型指南 — 什么时候用哪个

面试收尾题:你怎么选 requests 还是 aiohttp? 不是越快越好,要匹配场景。

场景选谁为什么
几百页requests
量小,同步够快,别过度设计
上万页aiohttp
异步并发,10 倍提速
需要登录态Session
自动管 Cookie,省心
项目规模大框架
上 Scrapy,自带调度/去重/管道

一句话总结:面试选型题标准答案:小规模用 requests + Session,大规模用 aiohttp 异步,企业级上 Scrapy 框架。 不是技术越好越对,是匹配场景越对越好。

自查提问 — 你能答出来吗?

Q1

为什么用 requests.Session 而不是直接 requests.get?两个核心原因。

提示:① 复用 TCP 连接(keep-alive)减少握手开销提升速度;② 自动管理 Cookie 保持登录态。

Q2

aiohttp 比 requests 快的原因是什么?Python GIL 在这里起了什么作用?

提示:requests 是同步,等响应时 CPU 空闲。aiohttp 用 asyncio 事件循环,IO 等待时自动切换到下一个任务。GIL 限制多线程并行,但协程是单线程,不受 GIL 瓶颈。

Q3

爬虫被服务器封 IP 了怎么办?代理 IP 池怎么维护?

提示:UA 伪装 + 代理 IP + 超时重试三件套。代理池用 Redis 维护:可用代理存 Set,定时检测可用性打分,失效自动剔除。又串上了 Day6 的 Redis。

Python 爬虫面试系列 · Day 7 · 请求库(requests 与 aiohttp)

下期预告:Day 8 — 解析库(BeautifulSoup / lxml / parsel)

觉得有用,点个「在看」

资源福利:想领爬虫面试题集?关注后回复 「面试题」作者:一个还在扛的爬虫工程师     

最新文章

随机文章