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=...) | |
| POST | requests.post(url, data/json=...) | |
| Headers | headers={'User-Agent': ...} | 不带 UA 的请求 = 直接告诉服务器"我是爬虫" |
| Cookies | | |
| 超时 | | |
面试坑点:面试官问"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 连接 | | |
| Cookie | | |
| 速度 | | |
一句话记忆:面试官问"为什么用 requests.Session?" 标准答案两个点:① 复用 TCP 连接减少握手开销提升速度;② 自动管理 Cookie 保持登录态。 这和 Day5 TCP/IP 那篇的连接复用是同一条线 — 基础和实战串起来了。
三、aiohttp — 异步爬虫的发动机
面试官进阶题:requests 爬 100 个页面要 50 秒,怎么提速? 答案就是异步。requests 是同步的 — 发一个请求等响应回来才能发下一个,中间 CPU 空等。aiohttp 配合 asyncio,等 A 响应的时候同时去发 B 和 C。
| 对比 | requests(同步) | aiohttp(异步) |
| 执行模型 | | |
| 100 页耗时 | | |
| 并发上限 | | |
| 学习成本 | | |
面试加分点:能说出 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 | |
| 需要登录态 | Session | |
| 项目规模大 | 框架 | |
一句话总结:面试选型题标准答案:小规模用 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)
觉得有用,点个「在看」
资源福利:想领爬虫面试题集?关注后回复 「面试题」作者:一个还在扛的爬虫工程师 |