Python爬虫入门:用‘李明借钱’的故事秒懂Headers和Cookies(附代码对比)

张开发
2026/4/21 18:14:18 15 分钟阅读

分享文章

Python爬虫入门:用‘李明借钱’的故事秒懂Headers和Cookies(附代码对比)
Python爬虫入门用‘李明借钱’的故事秒懂Headers和Cookies附代码对比想象一下你第一次走进一家高档餐厅服务员会通过你的着装、言谈举止来判断如何接待你。网络世界也是如此当你用Python爬虫访问网站时服务器就是那个服务员而Headers和Cookies就是你的着装和会员卡。本文将用一个生动的李明借钱故事带你轻松理解这些概念并通过三组代码对比展示实际应用场景。1. 从李明借钱看网络请求的底层逻辑在某个虚拟的村庄里住着一个叫李明的年轻人。他最近手头紧想找村里的财主王老爷借点钱。这个简单的借贷过程恰好映射了网络爬虫与服务器交互的核心机制。1.1 第一次尝试裸奔的请求李明直接走到王老爷家门口大喊借我100块钱结果可想而知——王老爷连门都没开。# 对应爬虫代码示例1不加任何Headers和Cookies import requests url https://example.com/api response requests.get(url) print(response.status_code) # 可能返回403或401这种情况就像爬虫直接发送请求而不带任何标识信息。服务器会认为这是一个可疑的访问通常会拒绝响应或返回错误代码。1.2 第二次尝试伪装身份李明学聪明了他穿上管家的衣服模仿管家的语气说老爷府上需要采购些物品请支100块钱。这次王老爷开了门但仔细一看发现是李明假扮的立刻把他赶了出去。# 对应爬虫代码示例2添加错误/不完整的Headers headers { User-Agent: Mozilla/5.0, # 不完整的浏览器标识 Accept: text/html # 只接受简单文本 } response requests.get(url, headersheaders) print(response.status_code) # 可能返回406或400这里的问题在于Headers信息不完整或不准确。就像李明的伪装经不起仔细检查一样服务器也能识别出这些信息有问题。1.3 第三次尝试完美伪装李明这次做了充分准备不仅穿上管家全套制服还带了盖有管家印章的采购清单甚至记得上次采购的时间和金额。王老爷检查无误后爽快地借出了钱。# 对应爬虫代码示例3正确的Headers和Cookies组合 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Referer: https://www.google.com/ } cookies { session_id: a1b2c3d4e5f6g7h8, user_token: x9y8z7w6v5u4 } response requests.get(url, headersheaders, cookiescookies) print(response.status_code) # 返回200表示成功这个完整的请求包含了现代浏览器通常会发送的所有必要信息服务器会认为这是一个正常的用户访问。2. Headers你的网络身份证Headers就像你在网络世界中的身份证和着装它告诉服务器你是谁、你能接受什么格式的内容、你从哪个页面跳转过来等重要信息。2.1 关键Header字段解析下表列出了爬虫中最常用的Header字段及其作用字段名作用示例值User-Agent标识客户端类型和版本Mozilla/5.0 (Windows NT 10.0...)Accept声明可接受的内容类型text/html,application/xhtmlxmlAccept-Language声明首选语言zh-CN,zh;q0.9Referer表明请求来源页面https://www.google.com/Host指定目标域名example.comConnection控制连接持久性keep-alive2.2 如何获取正确的Headers使用浏览器开发者工具F12访问目标网站切换到Network选项卡点击任意请求查看Headers信息提示现代网站常会检测User-Aent的真实性直接复制粘贴可能不够需要理解每个字段的含义。3. Cookies你的会话记忆卡Cookies是服务器留在你电脑上的小纸条记录了你的登录状态、个人偏好等信息。就像李明借钱时需要出示之前的借条一样爬虫也需要正确处理Cookies。3.1 Cookies的工作原理首次访问时服务器通过Set-Cookie头部下发Cookies浏览器保存这些Cookies到本地后续请求自动携带这些Cookies服务器通过Cookies识别用户身份# 处理Cookies的典型流程 first_response requests.get(login_url) cookies first_response.cookies # 获取初始Cookies # 携带Cookies发送后续请求 secured_response requests.get(protected_url, cookiescookies)3.2 常见Cookies类型会话Cookies临时性关闭浏览器即失效持久Cookies设置过期时间长期有效安全Cookies仅通过HTTPS传输HttpOnly Cookies防止JavaScript访问4. 实战三种场景代码对比让我们通过实际代码对比直观展示不同配置下的请求结果差异。4.1 场景一裸请求import requests url https://httpbin.org/headers response requests.get(url) print(状态码:, response.status_code) print(响应内容:, response.json())典型输出{ headers: { Host: httpbin.org, User-Agent: python-requests/2.26.0 } }问题显而易见User-Agent暴露了这是Python程序发出的请求很容易被识别为爬虫。4.2 场景二基本Headersheaders { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), Accept: text/html } response requests.get(url, headersheaders) print(状态码:, response.status_code) print(响应内容:, response.json())改进点伪装成浏览器User-Agent声明接受HTML内容但仍可能存在的问题Headers信息不完整缺少Referer等关键字段没有处理Cookies4.3 场景三完整配置headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Referer: https://www.google.com/, Upgrade-Insecure-Requests: 1 } # 先获取初始Cookies session requests.Session() login_response session.post(login_url, datacredentials) cookies session.cookies.get_dict() # 携带完整Headers和Cookies访问 response session.get(url, headersheaders) print(状态码:, response.status_code) print(响应内容:, response.json())最佳实践要点使用Session对象保持会话模拟完整浏览器Headers正确处理登录和Cookies维护请求间的上下文关系5. 高级技巧与常见问题排查即使配置了看似完美的Headers和Cookies爬虫仍可能遇到问题。以下是几个实战中总结的经验5.1 动态Cookies处理现代网站常使用动态生成的Cookies简单的复制粘贴可能不够# 动态获取并更新Cookies的示例 session requests.Session() # 首次请求获取初始Cookies home_page session.get(https://example.com) # 提取隐藏在HTML中的token soup BeautifulSoup(home_page.text, html.parser) csrf_token soup.find(input, {name: csrf_token})[value] # 使用token登录 login_data { username: your_username, password: your_password, csrf_token: csrf_token } session.post(https://example.com/login, datalogin_data) # 现在session中已包含登录后的Cookies5.2 Headers指纹检测绕过一些网站会进行更深入的Headers检测检测Headers顺序某些网站会检查Headers的排列顺序是否与真实浏览器一致检测缺少字段如缺少Accept-Encoding或Connection字段检测字段值格式User-Agent的版本号格式是否合理解决方案是使用专业的库如fake_useragent动态生成User-Agentfrom fake_useragent import UserAgent ua UserAgent() headers { User-Agent: ua.random, # 其他Headers... }5.3 常见错误代码及解决方案错误代码可能原因解决方案401未授权检查认证信息添加合适的Cookies或Token403禁止访问完善Headers特别是User-Agent和Referer429请求过多添加延迟使用代理IP轮换503服务不可用可能触发了反爬更换IP和User-Agent6. 安全与伦理考量虽然技术本身是中立的但在实际使用爬虫时仍需注意尊重robots.txt检查目标网站的爬虫政策控制请求频率避免对服务器造成过大负担不爬取敏感数据特别是个人隐私信息设置合理的超时避免长时间占用连接# 设置请求间隔和超时的最佳实践 import time import random for page in range(1, 11): try: response session.get(fhttps://example.com/page/{page}, headersheaders, timeout10) # 10秒超时 # 处理响应内容... # 随机延迟3-8秒 time.sleep(random.uniform(3, 8)) except requests.exceptions.RequestException as e: print(f请求第{page}页时出错:, str(e))

更多文章