Python爬虫实战:爬取外卖平台优惠券,自动领取+保存,省钱必备脚本

发布时间:2026/7/16 14:47:58

Python爬虫实战:爬取外卖平台优惠券,自动领取+保存,省钱必备脚本 作为一个每天都要点外卖的打工人我最烦的就是找优惠券每次点外卖之前都要进APP翻好几个页面找有没有能领的优惠券有时候翻半天找到一张几块钱的券浪费时间不说经常还会漏掉大额优惠券每次都觉得亏了几个亿。后来我写了个自动领券的爬虫脚本每天早上自动跑一次把某团、某饿上面所有能领的优惠券都领一遍自动保存到账户里点外卖的时候直接用我算了算平均每个月能省四五十块一年下来能省大几百奶茶钱都省出来了。今天把完整的教程和代码分享给大家每天省一杯豆浆钱还是没问题的。一、效果展示脚本运行之后会自动爬取所有可领取的优惠券判断有没有领过没领过的自动领取最后输出结果 某团优惠券领取结果 ✅ 成功领取满20减5元通用券有效期7天 ✅ 成功领取满30减8元早餐券有效期3天 ⚠️ 已经领取过满15减3元下午茶券 ❌ 领取失败新用户专享券不符合领取条件 本次共领取2张优惠券累计节省13元 某饿优惠券领取结果 ✅ 成功领取满25减6元通用券有效期7天 ✅ 成功领取会员专享满35减10元券有效期3天 本次共领取2张优惠券累计节省16元 所有优惠券已保存到 我的优惠券.txt所有领成功的券都会直接到你的账户里点外卖的时候直接就能用不用自己操作。二、准备工作2.1 安装需要的库pipinstallrequests fake_useragentrequests发送HTTP请求fake_useragent生成随机User-Agent避免被识别为爬虫2.2 抓包获取接口信息因为外卖平台的接口都是加密的而且每个人的接口参数都不一样所以我们需要先抓包拿到自己账户的优惠券接口信息。这一步是最关键的跟着步骤做很简单抓包工具选择安卓用户推荐用HttpCanary不用ROOT就能抓包操作简单iOS用户推荐用StreamApp Store就能下载免费好用电脑端用Charles或者Fiddler手机和电脑连同一个WiFi配置代理就能抓抓包步骤以某团为例打开抓包工具配置好代理确保能抓到手机的请求打开外卖APP进入“我的-红包卡券”页面点击“领取更多优惠券”回到抓包工具找请求URL里包含coupon、redpacket、promotion这类关键词的请求找到返回优惠券列表的接口复制这几个信息请求URL请求方法一般是GET或者POST请求头Headers里的所有内容尤其是Cookie、token这些认证信息请求参数Params或者Body⚠️ 注意这些信息里包含你的账户认证信息不要泄露给别人不然别人可以登录你的账户。三、完整可运行代码我写的是通用框架你只需要把你抓包得到的接口信息填到对应的位置就行注释都写得很清楚importrequestsfromfake_useragentimportUserAgentimportjsonimporttime# 配置区域改成你自己抓包的信息 # 某团配置MEITUAN_ENABLETrue# 是否开启某团自动领券MEITUAN_COUPON_LIST_URL你抓的某团优惠券列表接口URLMEITUAN_COUPON_RECEIVE_URL你抓的某团领取优惠券接口URLMEITUAN_HEADERS{# 把你抓的请求头全部复制到这里User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 meituan/12.0.1,Cookie:你抓的Cookie,token:你抓的token,Referer:https://market.waimai.meituan.com/}MEITUAN_PARAMS{# 把你抓的请求参数复制到这里platform:4,partner:4,version:7.90.0}# 某饿配置ELE_ENABLETrue# 是否开启某饿自动领券ELE_COUPON_LIST_URL你抓的某饿优惠券列表接口URLELE_COUPON_RECEIVE_URL你抓的某饿领取优惠券接口URLELE_HEADERS{# 把你抓的请求头全部复制到这里User-Agent:Mozilla/5.0 (Linux; Android 12; SM-G9910 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/108.0.5359.128 Mobile Safari/537.36 Eleme/10.14.5,Cookie:你抓的Cookie,x-eos-token:你抓的token,Referer:https://h5.ele.me/}ELE_PARAMS{# 把你抓的请求参数复制到这里userId:你的用户ID,latitude:你的纬度可以填固定值,longitude:你的经度可以填固定值}# 通用配置REQUEST_DELAY1.5# 请求间隔时间单位秒不要改太小容易被封SAVE_FILE我的优惠券.txt# 优惠券保存路径# uaUserAgent()# 已经领取过的优惠券ID避免重复领取received_couponsset()# 加载已经领取过的优惠券记录defload_received_coupons():globalreceived_couponstry:withopen(received_coupons.json,r,encodingutf-8)asf:received_couponsset(json.load(f))except:received_couponsset()# 保存已经领取过的优惠券记录defsave_received_coupons():withopen(received_coupons.json,w,encodingutf-8)asf:json.dump(list(received_coupons),f)# 保存领取成功的优惠券到文件defsave_coupon_to_file(platform,coupon_info):withopen(SAVE_FILE,a,encodingutf-8)asf:f.write(f[{platform}]{coupon_info[title]}满{coupon_info[full_amount]}减{coupon_info[amount]}元有效期至{coupon_info[expire_time]}\n)# 某团领券逻辑defmeituan_receive():ifnotMEITUAN_ENABLE:return[],0print(\n 正在领取某团优惠券 )success_list[]total_save0try:# 1. 获取优惠券列表headersMEITUAN_HEADERS.copy()headers[User-Agent]ua.random# 随机UA避免被识别responserequests.get(MEITUAN_COUPON_LIST_URL,headersheaders,paramsMEITUAN_PARAMS,timeout10)response.raise_for_status()dataresponse.json()# 解析优惠券列表这里要根据你抓的接口返回格式改我这里是示例结构coupon_listdata.get(data,{}).get(couponList,[])print(f找到{len(coupon_list)}张可领取优惠券)forcouponincoupon_list:coupon_idcoupon.get(couponId)ifcoupon_idinreceived_coupons:print(f⚠️ 已经领取过{coupon.get(title,未知优惠券)})continue# 判断是否可领取ifnotcoupon.get(canReceive,False):print(f❌ 无法领取{coupon.get(title,未知优惠券)}原因{coupon.get(reason,不符合条件)})continue# 2. 领取优惠券receive_params{couponId:coupon_id,**MEITUAN_PARAMS}time.sleep(REQUEST_DELAY)# 加延迟避免被封receive_responserequests.get(MEITUAN_COUPON_RECEIVE_URL,headersheaders,paramsreceive_params,timeout10)receive_datareceive_response.json()ifreceive_data.get(code)0:coupon_info{title:coupon.get(title,通用券),amount:coupon.get(amount,0),full_amount:coupon.get(fullAmount,0),expire_time:coupon.get(expireTime,未知)}success_list.append(coupon_info)total_savecoupon_info[amount]received_coupons.add(coupon_id)print(f✅ 成功领取{coupon_info[title]}满{coupon_info[full_amount]}减{coupon_info[amount]}元有效期{coupon_info[expire_time]})save_coupon_to_file(美团,coupon_info)else:print(f❌ 领取失败{coupon.get(title,未知优惠券)}原因{receive_data.get(msg,未知错误)})exceptExceptionase:print(f❌ 某团领券失败{str(e)})print(f本次共领取{len(success_list)}张某团优惠券累计节省{total_save}元)returnsuccess_list,total_save# 某饿领券逻辑defele_receive():ifnotELE_ENABLE:return[],0print(\n 正在领取某饿优惠券 )success_list[]total_save0try:# 1. 获取优惠券列表headersELE_HEADERS.copy()headers[User-Agent]ua.random# 某饿一般是POST请求根据实际情况改responserequests.post(ELE_COUPON_LIST_URL,headersheaders,jsonELE_PARAMS,timeout10)response.raise_for_status()dataresponse.json()# 解析优惠券列表这里要根据你抓的接口返回格式改我这里是示例结构coupon_listdata.get(result,{}).get(coupons,[])print(f找到{len(coupon_list)}张可领取优惠券)forcouponincoupon_list:coupon_idcoupon.get(id)ifcoupon_idinreceived_coupons:print(f⚠️ 已经领取过{coupon.get(name,未知优惠券)})continueifnotcoupon.get(available,False):print(f❌ 无法领取{coupon.get(name,未知优惠券)}原因{coupon.get(unavailableReason,不符合条件)})continue# 2. 领取优惠券receive_data{couponId:coupon_id,**ELE_PARAMS}time.sleep(REQUEST_DELAY)receive_responserequests.post(ELE_COUPON_RECEIVE_URL,headersheaders,jsonreceive_data,timeout10)receive_resultreceive_response.json()ifreceive_result.get(success):coupon_info{title:coupon.get(name,通用券),amount:coupon.get(discount,0),full_amount:coupon.get(condition,0),expire_time:coupon.get(expireDate,未知)}success_list.append(coupon_info)total_savecoupon_info[amount]received_coupons.add(coupon_id)print(f✅ 成功领取{coupon_info[title]}满{coupon_info[full_amount]}减{coupon_info[amount]}元有效期{coupon_info[expire_time]})save_coupon_to_file(饿了么,coupon_info)else:print(f❌ 领取失败{coupon.get(name,未知优惠券)}原因{receive_result.get(message,未知错误)})exceptExceptionase:print(f❌ 某饿领券失败{str(e)})print(f本次共领取{len(success_list)}张某饿优惠券累计节省{total_save}元)returnsuccess_list,total_savedefmain():load_received_coupons()# 清空上次的优惠券文件withopen(SAVE_FILE,w,encodingutf-8)asf:f.write( 我的优惠券 \n)meituan_coupons,meituan_savemeituan_receive()ele_coupons,ele_saveele_receive()total_countlen(meituan_coupons)len(ele_coupons)total_savemeituan_saveele_saveprint(\n*60)print(f 全部领取完成共领取{total_count}张优惠券累计节省{total_save}元)print(f优惠券详情已保存到{SAVE_FILE})save_received_coupons()if__name____main__:main()四、使用说明4.1 配置脚本把你抓包得到的接口信息填到代码开头的配置区域里重点注意优惠券列表的返回格式每个平台、每个版本的APP都不一样你需要自己修改解析优惠券列表的部分对应字段比如couponId、title、amount这些要和你抓的接口返回的字段完全一致领取优惠券的参数也要和你抓包的完全一致不要漏参数不然会领取失败如果只需要领一个平台的把另一个平台的ENABLE改成False就行4.2 测试运行第一次运行建议先手动执行看看能不能正常领券如果报错的话根据错误信息排查401/403错误一般是认证信息过期了重新抓包更新Cookie和token就行参数错误检查请求参数是不是漏了或者填错了接口返回空一般是接口地址变了重新抓包找正确的接口地址4.3 定时自动运行测试没问题之后可以设置成定时任务每天自动运行一次不需要手动执行Windows用户用任务计划程序设置每天早上8点运行脚本路径填你脚本的保存位置Mac/Linux用户用crontab执行crontab -e添加一行0 8 * * * python3 /path/to/your/coupon.py保存就行手机用户可以用Termux运行搭配termux-job-scheduler设置定时任务出门在外也能自动领我是设置的每天早上8点自动运行领完还会调用企业微信机器人给我发个通知告诉我今天领了多少券省了多少钱特别省心。五、防封技巧外卖平台的反爬还是比较严的我用了半年都没被封过分享几个防封技巧请求间隔不要太短我设置的是1.5秒不要改到1秒以下请求太频繁很容易被封IP或者封号不要高频运行一天跑一次就足够了不要几个小时就跑一次优惠券不会更新那么频繁模拟真实请求所有请求头和参数都要和真实APP的一致不要漏参数不要修改UA以外的请求头不要大量领取不同账号的券这个脚本仅限个人自用不要用来批量刷不同账号的优惠券很容易被平台检测到封号接口变了及时更新平台改版的时候接口会变发现脚本用不了的时候重新抓包更新一下接口地址和参数就行六、常见问题解决6.1 抓不到包怎么办检查手机和抓包工具是不是在同一个WiFi下检查代理配置是不是正确端口号有没有填对安卓11以上的系统需要安装根证书才能抓HTTPS的包按照抓包工具的提示安装证书就行如果还是抓不到可以用电脑端的安卓模拟器在模拟器里装外卖APP电脑上直接抓模拟器的包更简单6.2 提示“领取失败参数错误”检查领取接口的参数是不是和你抓包的一致有没有漏参数尤其是couponId、userId这些关键参数很多时候是因为参数名写错了或者少了参数导致的。6.3 登录过期怎么办外卖平台的Cookie有效期一般是1-2周过期了重新登录APP再抓一次包更新一下Cookie和token就行。6.4 会被封号吗只要你是个人正常使用不批量刷券不高频请求基本不会被封我自己用了半年多两个账号都没出过问题。如果真的被限制领券了停几天不用就自动恢复了。七、效果实测我自己用了这个脚本半年多平均每天能领3-5张优惠券有时候能领到满30减10的大额券平均每个月能省40-50块一年下来能省五六百奶茶钱和早饭钱都省出来了。我还加了推送功能每天领完券会自动把结果推送到我的微信上不用我自己看运行结果特别省心【自动领券通知】 今日共领取4张优惠券累计节省18元 ✅ 美团满20减5元通用券 ✅ 美团满30减8元早餐券 ✅ 饿了么满25减6元通用券 ✅ 饿了么满35减7元会员券注意事项仅限个人学习使用本脚本仅用于个人学习交流不要用于商业用途不要批量刷券尊重平台规则风险自负使用脚本造成的任何账户问题由使用者自行承担合理使用不要过度薅羊毛接口适配问题外卖平台会不定期更新接口如果脚本用不了了重新抓包更新一下配置就行一般半小时就能改好这个脚本虽然简单但真的特别实用对于天天点外卖的打工人来说一年下来能省不少钱建议大家都可以试试。如果配置过程中遇到什么问题可以在评论区留言。

相关新闻