网页优化与网站优,wordpress前台访问地址,全国建筑工程企业资质查询平台,做网站致富一、引言#xff1a;为什么要自定义HTTP客户端#xff1f;
在Python开发中#xff0c;我们常用requests库处理HTTP请求#xff0c;但在某些场景下#xff0c;自定义HTTP客户端更具优势。12306抢票项目作为一个对网络请求有特殊要求的系统#xff0c;选择了自定义HTTPClie…一、引言为什么要自定义HTTP客户端在Python开发中我们常用requests库处理HTTP请求但在某些场景下自定义HTTP客户端更具优势。12306抢票项目作为一个对网络请求有特殊要求的系统选择了自定义HTTPClient类来管理网络请求。本文将深入分析该项目中HTTPClient的实现细节探讨会话管理、Cookie处理等核心功能。二、12306项目中的HTTPClient实现1. 项目目录结构12306项目的HTTP客户端位于myUrllib/httpUtils.py文件中是整个项目的网络核心12306-master/ ├── myUrllib/ │ ├── __init__.py │ └── httpUtils.py # 自定义HTTPClient类 ├── init/ │ ├── login.py # 使用HTTPClient登录 │ └── select_ticket_info.py # 使用HTTPClient查询和下单 └── inter/ └── *.py # 各种接口调用均依赖HTTPClient2. HTTPClient类核心代码# -*- codingutf-8 -*-importurllibimporturllib2importjsonimportrandomimporttimeclassHTTPClient:def__init__(self,is_proxy0): 初始化HTTP客户端 :param is_proxy: 是否使用代理0为不使用1为使用 self.is_proxyis_proxy self.cookies{}# 存储Cookieself._cdn# CDN节点self.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,Content-Type:application/x-www-form-urlencoded; charsetUTF-8,Referer:https://kyfw.12306.cn/otn/login/init,}defsend(self,url,dataNone,methodGET): 发送HTTP请求 :param url: 请求URL :param data: 请求数据GET为NonePOST为字典 :param method: 请求方法GET或POST :return: 响应结果JSON格式 try:# 1. 构建请求ifmethodGET:ifdata:url?urllib.urlencode(data)requrllib2.Request(url,headersself.headers)else:# POSTifdata:dataurllib.urlencode(data)requrllib2.Request(url,datadata,headersself.headers)# 2. 添加Cookieifself.cookies:cookie_str; .join([{}{}.format(k,v)fork,vinself.cookies.items()])req.add_header(Cookie,cookie_str)# 3. 发送请求responseurllib2.urlopen(req,timeout10)# 4. 处理响应contentresponse.read()resultjson.loads(content)ifcontentelse{}# 5. 更新CookieifSet-Cookieinresponse.headers:cookie_headerresponse.headers[Set-Cookie]# 解析并更新Cookieforcookieincookie_header.split(;):ifincookie:key,valuecookie.split(,1)keykey.strip()valuevalue.split(;)[0].strip()ifkey:self.cookies[key]valuereturnresultexceptExceptionase:print(uHTTP请求异常: {}.format(e))return{}defdel_cookies(self):清除所有Cookieself.cookies.clear()defset_cookie(self,key,value): 设置Cookie :param key: Cookie名 :param value: Cookie值 self.cookies[key]value三、核心功能实现解析1. 会话管理与会话保持12306项目通过以下机制实现会话管理Cookie持久化将每次请求的Cookie存储在self.cookies字典中自动Cookie添加发送请求时自动将Cookie添加到请求头中Cookie更新响应中包含新Cookie时自动更新本地存储# 设置Cookieself.set_cookie(SESSIONID,abc123)# 发送请求时自动添加Cookieresponseself.send(https://kyfw.12306.cn/otn/login/checkUser)# Cookie自动更新print(self.cookies)# 包含最新的Cookie2. Cookie处理与登录状态维护登录状态完全依赖Cookie管理登录成功后服务器返回的Cookie会被自动存储后续请求自动携带这些Cookie保持登录状态可通过del_cookies()方法清除登录状态用于重新登录# 登录流程login_resultself.send(https://kyfw.12306.cn/otn/login/loginAysnSuggest,data{username:xxx,password:xxx},methodPOST)# 登录成功后Cookie自动更新iflogin_result.get(result_code)0:print(登录成功Cookie已更新)# 后续请求自动携带登录Cookieuser_infoself.send(https://kyfw.12306.cn/otn/login/getUserInfo)3. 灵活的配置选项代理支持通过is_proxy参数控制是否使用代理CDN支持可设置CDN节点加速请求自定义请求头支持灵活配置请求头四、自定义客户端vs第三方库优势对比特性自定义HTTPClientrequests库性能轻量高效功能丰富但稍重定制性完全可控可根据需求调整封装较深定制困难学习成本高需要理解HTTP底层低API简洁易用12306适配专为12306优化如CDN支持需要额外配置依赖仅依赖标准库需要安装第三方库自定义客户端的核心优势完全可控可根据12306的特殊要求调整请求逻辑轻量级不依赖第三方库减少部署复杂度针对性优化专为12306的API设计如Cookie处理、请求头等易于调试可直接修改源码方便排查问题五、HTTPClient在项目中的应用场景1. 登录流程# init/login.pyclassGoLogin:def__init__(self,session,is_auto_code,auto_code_type):self.sessionsession# ...defbaseLogin(self,user,passwd):登录过程logurlself.session.urls[login]logData{username:user,password:passwd,appid:otn}# 使用HTTPClient发送登录请求tresultself.session.httpClint.send(logurl,logData)# ...2. 余票查询# inter/Query.pydefsendQuery(self):发送余票查询请求# 构建查询参数# ...# 使用HTTPClient发送查询请求resultself.session.httpClint.send(queryUrl,queryData)# 解析查询结果# ...3. 订单提交# inter/SubmitOrderRequest.pydefsendSubmitOrderRequest(self):提交订单请求# 构建订单数据# ...# 使用HTTPClient发送订单请求resultself.session.httpClint.send(orderUrl,orderData,methodPOST)# 处理订单结果# ...六、总结自定义HTTP客户端的价值12306抢票项目的自定义HTTPClient类展示了如何基于Python标准库实现高效、灵活的网络请求管理。通过精心设计的会话管理和Cookie处理机制该客户端能够很好地适应12306的特殊需求。关键技术点回顾会话管理通过Cookie持久化实现会话保持Cookie处理自动解析、存储和发送Cookie灵活配置支持代理、CDN等高级功能轻量级设计仅依赖Python标准库针对性优化专为12306 API设计适用场景自定义HTTP客户端适用于以下场景对网络请求有特殊要求的系统需要深度定制HTTP请求逻辑的场景对性能要求极高的应用不希望引入第三方依赖的项目通过学习12306项目的HTTPClient实现我们可以更好地理解HTTP协议的底层机制掌握会话管理、Cookie处理等核心技术为构建更强大的网络应用打下基础。七、代码优化建议虽然该HTTPClient实现已经满足项目需求但仍有优化空间添加重试机制网络请求失败时自动重试支持HTTPS代理目前仅支持HTTP代理添加请求日志方便调试和监控支持异步请求提高并发处理能力优化Cookie解析更严谨地处理各种Cookie格式以上优化建议可根据实际需求选择性实施进一步提升HTTPClient的性能和可靠性。