python网络请求库实战 - urllib与requests深度解析
文章目录1.1 urllib - Python内置请求库基础使用添加请求头带参数的GET请求POST请求异常处理1.2 requests - 爬虫开发的首选库安装基础请求请求参数的几种传递方式请求头设置Cookie处理代理配置超时和重试响应数据处理1.3 实战综合运用GET/POST请求1.1 urllib - Python内置请求库基础使用urllib不需要安装直接导入使用。虽然不如requests简洁但了解它能帮助你理解HTTP请求的底层逻辑。fromurllib.requestimporturlopen,Requestfromurllib.parseimporturlencode,quotefromurllib.errorimportURLError,HTTPError# 最简单的GET请求withurlopen(https://www.python.org)asresponse:htmlresponse.read().decode(utf-8)print(html[:500])# 打印前500个字符添加请求头不加请求头的请求很容易被识别为爬虫。urlhttps://example.comheaders{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36}# 使用Request对象添加请求头reqRequest(url,headersheaders)withurlopen(req,timeout10)asresponse:htmlresponse.read().decode(utf-8)带参数的GET请求base_urlhttps://example.com/searchparams{keyword:Python爬虫,page:1,size:20}# urlencode将字典转为查询字符串query_stringurlencode(params)full_urlf{base_url}?{query_string}print(full_url)# https://example.com/search?keywordPython%E7%88%AC%E8%99%ABpage1size20POST请求urlhttps://example.com/logindata{username:test,password:123456}# POST数据需要编码为bytespost_dataurlencode(data).encode(utf-8)reqRequest(url,datapost_data,headersheaders)withurlopen(req)asresponse:resultresponse.read().decode(utf-8)print(result)异常处理try:responseurlopen(https://example.com,timeout5)exceptHTTPErrorase:print(fHTTP错误:{e.code}-{e.reason})exceptURLErrorase:print(fURL错误:{e.reason})exceptExceptionase:print(f其他错误:{e})1.2 requests - 爬虫开发的首选库安装pipinstallrequests基础请求requests的API设计非常直观大大简化了HTTP请求的代码量。importrequests# GET请求responserequests.get(https://www.python.org)print(response.status_code)# 200print(response.encoding)# utf-8print(response.text[:200])# HTML内容# POST请求responserequests.post(https://example.com/login,data{user:test})# 其他请求方法requests.put(https://api.example.com/resource/1,json{name:new_name})requests.delete(https://api.example.com/resource/1)请求参数的几种传递方式# 方式1: params参数(GET请求)params{keyword:Python,page:2}responserequests.get(https://example.com/search,paramsparams)print(response.url)# https://example.com/search?keywordPythonpage2# 方式2: data参数(POST表单)data{username:user,password:pass}responserequests.post(https://example.com/login,datadata)# 方式3: json参数(POST JSON)payload{action:search,keyword:Python}responserequests.post(https://api.example.com/data,jsonpayload)# 方式4: 请求体raw数据importjson responserequests.post(https://api.example.com/data,datajson.dumps(payload),headers{Content-Type:application/json})请求头设置headers{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,Accept:application/json, text/plain, */*,Accept-Language:zh-CN,zh;q0.9,Referer:https://example.com,Connection:keep-alive}responserequests.get(https://example.com/api/data,headersheaders)常见User-Agent列表importrandom USER_AGENTS[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0,Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,]defget_random_ua():returnrandom.choice(USER_AGENTS)headers{User-Agent:get_random_ua()}responserequests.get(url,headersheaders)Cookie处理# 方式1: 直接在headers中设置headers{Cookie:session_idabc123; user_id12345; tokenxyz789}responserequests.get(url,headersheaders)# 方式2: 通过cookies参数cookies{session_id:abc123,user_id:12345}responserequests.get(url,cookiescookies)# 方式3: 使用Session自动管理Cookie(最推荐)sessionrequests.Session()session.headers.update({User-Agent:Mozilla/5.0 ...})# 第一次请求: 登录login_data{username:test,password:123456}session.post(https://example.com/login,datalogin_data)# 后续请求: 自动携带Cookieresponsesession.get(https://example.com/user/orders)profilesession.get(https://example.com/user/profile)代理配置代理是突破IP封禁的常用方法。# 单一代理proxies{http:http://127.0.0.1:7890,https:http://127.0.0.1:7890}responserequests.get(url,proxiesproxies)# 带用户名密码的代理proxies{http:http://username:passwordproxy.example.com:8080,https:http://username:passwordproxy.example.com:8080}# 随机代理池PROXY_LIST[http://proxy1.example.com:8080,http://proxy2.example.com:8080,http://proxy3.example.com:8080,]defget_random_proxy():iprandom.choice(PROXY_LIST)return{http:ip,https:ip}responserequests.get(url,proxiesget_random_proxy())超时和重试importtime# 设置超时try:responserequests.get(url,timeout10)# 10秒超时# timeout(连接超时, 读取超时)responserequests.get(url,timeout(5,15))# 连接5秒,读取15秒exceptrequests.Timeout:print(请求超时)# 自动重试封装deffetch_url(url,headersNone,max_retries3,delay2):forattemptinrange(1,max_retries1):try:responserequests.get(url,headersheaders,timeout10)response.raise_for_status()# 非2xx状态码抛出异常returnresponseexceptrequests.Timeout:print(f超时,第{attempt}次重试)exceptrequests.HTTPErrorase:print(fHTTP错误{e.response.status_code})ife.response.status_codein[403,404]:returnNone# 这类错误重试无意义exceptrequests.RequestExceptionase:print(f请求异常:{e})ifattemptmax_retries:time.sleep(delay*attempt)# 递增延迟returnNone响应数据处理responserequests.get(https://example.com)# 自动检测编码print(response.encoding)# 检测到的编码print(response.apparent_encoding)# 更准确的编码检测# 设置编码解决乱码response.encodingutf-8htmlresponse.text# 二进制数据(图片、PDF等)image_responserequests.get(https://example.com/image.jpg)withopen(image.jpg,wb)asf:f.write(image_response.content)# 大文件流式下载withrequests.get(https://example.com/large_file.zip,streamTrue)asr:r.raise_for_status()withopen(large_file.zip,wb)asf:forchunkinr.iter_content(chunk_size8192):f.write(chunk)print(下载完成)1.3 实战综合运用GET/POST请求下面是一个模拟搜索引擎关键词搜索和翻页爬取的完整示例。importrequestsimporttimeimportrandomfrombs4importBeautifulSoupclassSimpleSpider:def__init__(self):self.sessionrequests.Session()self.session.headers.update({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,Accept-Language:zh-CN,zh;q0.9})self.results[]defsearch(self,keyword,max_pages5):print(f开始爬取关键词:{keyword})forpageinrange(1,max_pages1):print(f正在爬取第{page}页...)params{q:keyword,page:page,size:20}responseself._fetch(https://example.com/search,paramsparams)ifnotresponse:print(f第{page}页获取失败,跳过)continueitemsself._parse(response.text)self.results.extend(items)print(f第{page}页提取{len(items)}条数据)# 随机延时,避免过快请求sleep_timerandom.uniform(1.0,2.5)time.sleep(sleep_time)returnself.resultsdef_fetch(self,url,paramsNone):try:responseself.session.get(url,paramsparams,timeout10)response.raise_for_status()returnresponseexceptExceptionase:print(f请求失败:{e})returnNonedef_parse(self,html):soupBeautifulSoup(html,lxml)items[]foriteminsoup.select(div.result-item):items.append({title:item.select_one(h3).text.strip(),url:item.select_one(a)[href],summary:item.select_one(p.summary).text.strip()})returnitemsdefsave(self,filenameresults.json):importjsonwithopen(filename,w,encodingutf-8)asf:json.dump(self.results,f,ensure_asciiFalse,indent2)print(f已保存{len(self.results)}条数据到{filename})# 使用示例spiderSimpleSpider()dataspider.search(Python爬虫教程,max_pages3)spider.save()

相关新闻

C++俄罗斯方块项目实战:从架构设计到性能优化的完整指南

C++俄罗斯方块项目实战:从架构设计到性能优化的完整指南

1. 项目概述:为什么用C重写俄罗斯方块依然值得深究? 俄罗斯方块,这个诞生于上世纪80年代的经典游戏,几乎成了每一位程序员学习图形编程或游戏逻辑的“Hello World”。你可能觉得,用C实现一个俄罗斯方块,听起…

2026/10/15 8:23:20 阅读更多 →
架构揭秘:REFramework如何实现RE引擎游戏的跨平台模组支持

架构揭秘:REFramework如何实现RE引擎游戏的跨平台模组支持

架构揭秘:REFramework如何实现RE引擎游戏的跨平台模组支持 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework REFramework作为RE Engin…

2026/10/4 22:07:00 阅读更多 →
Linux 下 cat 和 more 的用法

Linux 下 cat 和 more 的用法

Linux 下 cat 和 more 的用法 cat: 一次性显示整个文件 文件过长时会一屏刷到底 # 显示文件内容 cat file.txt# 带行号显示 cat -n file.txt# 连接多个文件 cat file1.txt file2.txt# 将内容重定向写入文件 cat file1.txt file2.txt > combined.txtmore :分页显示&#xff0…

2026/9/27 21:00:04 阅读更多 →

最新新闻

幼儿园国际象棋比赛全攻略:从赛事设计到教学实操的完整指南

幼儿园国际象棋比赛全攻略:从赛事设计到教学实操的完整指南

1. 一场幼儿园棋赛背后,藏着多少被低估的教育设计第一次看到“幼儿园办国际象棋比赛”这个事,我脑子里冒出来的第一个念头是:三四岁的孩子坐得住吗?棋子会不会被当成积木搭着玩?但仔细看完整个活动的组织逻辑之后&…

2026/10/15 8:22:31 阅读更多 →
OpenLayers地图开发避坑指南:坐标系、图层栈与离线部署

OpenLayers地图开发避坑指南:坐标系、图层栈与离线部署

简介:本资源为 OpenLayers 地图开发必备的前端基础文件包,面向 WebGIS 初学者、前端开发者及地理信息相关课程学习者,解决快速集成开源地图能力时缺少核心依赖的问题。压缩包共 3 个文件(152KB),含核心 Jav…

2026/10/15 8:22:31 阅读更多 →
幼儿园国际象棋比赛怎么搞?从赛制设计到现场实操的完整复盘

幼儿园国际象棋比赛怎么搞?从赛制设计到现场实操的完整复盘

1. 一场幼儿园棋赛背后的教育设计逻辑1.1 为什么选国际象棋而不是其他棋类接到这个项目标题的时候,我第一反应是:幼儿园搞国际象棋比赛,这个选型挺有意思。干了这么多年一线教育项目,我见过太多幼儿园做活动是"什么热闹做什么…

2026/10/15 8:22:31 阅读更多 →
可靠评估对抗鲁棒性:免调参多样性攻击集成方法

可靠评估对抗鲁棒性:免调参多样性攻击集成方法

1. 项目概述:为什么“可靠评估对抗鲁棒性”这件事比想象中更难你有没有遇到过这种情况:模型在标准测试集上准确率98%,可只要加一丁点人眼根本看不出的扰动——比如把某张猫图的像素值整体调高0.002,它就坚定地把猫判成烤面包机&am…

2026/10/15 8:22:31 阅读更多 →
前端导出Excel/CSV实战:方案选型、编码陷阱与性能优化

前端导出Excel/CSV实战:方案选型、编码陷阱与性能优化

1. 为什么前端导出这件事值得认真对待但凡做过管理后台、数据看板或者报表类项目的同行,大概率都碰到过同一个需求:页面上辛辛苦苦渲染出来的表格,业务方一句话——“能不能加个导出按钮,我要Excel”。听起来简单,真动…

2026/10/15 8:22:31 阅读更多 →
七层封装引发的支付回调事故:过度设计如何安全拆解?

七层封装引发的支付回调事故:过度设计如何安全拆解?

1. 凌晨两点的报警:一次由"优雅设计"引发的线上事故先交代一下背景,免得大家以为我要讲什么架子上的空道理。前阵子公司某个核心支付项目出了一个线上事故,直接触发告警群炸锅的那种。当时我人在家里,正准备关灯睡觉&am…

2026/10/15 8:21:31 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →