登录
首页 >  文章 >  python教程

Python爬虫教程:requests.get抓取网页源码详解

时间:2026-03-12 17:12:31 478浏览 收藏

本文深入剖析了 Python 中 requests.get() 在网页爬虫实战中常见的四大痛点:乱码与空内容问题(根源在于编码识别错误,推荐用 response.content 配合 chardet 或 charset_normalizer 精准解码)、无法获取 JS 渲染内容(强调 requests 本质是静态 HTTP 客户端,需转向抓取 API 或启用浏览器自动化工具)、超时与连接不稳定(必须设置合理 timeout、集成自动重试机制并复用 Session 提升健壮性),以及 Cookie、Referer 等关键请求头缺失导致的反爬拦截(强调真实抓包还原请求上下文的重要性)。文章不讲空泛理论,而是直击生产环境中的真实坑点,给出可立即落地的硬核解决方案,帮你从“能发请求”真正进阶到“稳定、可靠、抗干扰地抓到数据”。

Python爬虫怎么抓网页_requests.get()获取网页HTML源码实战教程

requests.get() 返回空内容或乱码怎么办

不是请求失败,而是响应体没被正确解码。requests 默认用 response.encoding 解码,但很多网页的 Content-Type 没带 charset,或者 HTML meta 里声明的编码和实际不符,导致 response.text 出现乱码或截断。

实操建议:

  • 优先用 response.content(bytes)配合 chardet.detect()charset_normalizer.from_bytes() 推测编码,再手动 decode
  • 如果知道网页是 UTF-8,直接 response.content.decode('utf-8'),比 response.text 更可靠
  • 遇到 GBK/GB2312 网页(尤其国内老站),别信 response.apparent_encoding,它常误判;改用 response.content.decode('gbk', errors='ignore')
  • 设置 headers={'User-Agent': 'Mozilla/5.0...'},否则有些网站返回 403 或空页面

为什么 requests.get() 抓不到 JavaScript 渲染的内容

requests 是纯 HTTP 客户端,不执行 JS、不解析 DOM、不维护会话上下文。它拿到的只是服务器返回的原始 HTML 字符串,所有通过 fetchaxios 或 Vue/React 动态插入的内容,它一概看不见。

实操建议:

  • 先用浏览器「查看页面源代码」(Ctrl+U),确认目标数据是否在初始 HTML 里;如果只在「元素」面板里出现,说明是 JS 渲染的,requests 无能为力
  • 检查 Network 面板,找 XHR/Fetch 请求,复制其 URL 和 headers,用 requests.get() 直接请求那个接口(常返回 JSON)
  • 真需要渲染能力时,换 seleniumplaywright,但代价是慢、重、易被反爬;requests 永远只适合静态 HTML 或 API 抓取

超时、重试、连接错误这些基础问题怎么稳住

网络不稳定时,requests.get() 默认会卡死(无 timeout)、不重试、遇到 DNS 失败就抛 ConnectionError,线上脚本很容易崩。

实操建议:

  • 必须加 timeout=(3, 7):第一个数字是连接超时,第二个是读取超时;不要只写一个数字,否则可能卡在大文件下载上
  • urllib3.util.Retry 配合 requests.adapters.HTTPAdapter 实现自动重试,重点重试 ConnectTimeoutReadTimeout,别盲目重试 404 或 500
  • DNS 缓存问题常见于容器或云函数环境,可加 session.mount('http://', adapter) 统一控制
  • 别在循环里反复新建 Session,复用它才能复用连接池,否则并发高了直接触发 Max retries exceeded

Cookie、登录态、Referer 这些头信息怎么传才不被拒

很多网站靠 CookieRefererOrigin 判断请求合法性。光有 User-Agent 不够,漏掉关键字段就会返回 302 跳登录页或 403。

实操建议:

  • 登录后抓包,把浏览器发出的完整 Cookie 字符串(如 'sessionid=abc123; csrftoken=xyz789')塞进 headers={'Cookie': '...'},别试图自己拼 requests.Session().cookies.set()
  • Referer 必须和当前请求路径逻辑一致,比如从 /list 页面点进 /detail/123,那请求 detail 时 Referer 就得是 /list,否则某些风控直接拦截
  • 敏感操作(如提交表单)要带上 X-CSRFTokencsrftoken cookie 值,这个通常藏在 HTML 的 里,得先 get 一次页面提取
  • Session 对象自动管理 Cookie,但注意:跨域名不共享,且 session.get() 不会自动处理 302 带来的 Set-Cookie(除非显式设 allow_redirects=True

真正难的从来不是发个请求,而是看懂网站怎么防你——它在哪埋检测点、哪些 header 是硬性门槛、哪些字段会随时间/用户动态变化。这些细节不翻 Network 面板、不对比前后请求,光查文档没用。

终于介绍完啦!小伙伴们,这篇关于《Python爬虫教程:requests.get抓取网页源码详解》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>