电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

使用 Python 在京東上搶口罩的思路詳解

瀏覽:6日期:2022-08-05 17:16:42

使用 Python 在京東上搶口罩的思路詳解

全國抗'疫'這么久終于見到曙光,在家待了將近一個月,現(xiàn)在終于可以去上班了,可是卻發(fā)現(xiàn)出門必備的口罩卻一直買不到。最近看到京東上每天都會有口罩的秒殺活動,試了幾次卻怎么也搶不到,到了搶購的時間,瀏覽器的頁面根本就刷新不出來,等刷出來秒殺也結(jié)束了。現(xiàn)在每天只放出一萬個,卻有幾百萬人在搶,很想知道別人是怎么搶到的,于是就在網(wǎng)上找了大神公開出來的搶購代碼。看了下代碼并不復(fù)雜,現(xiàn)在我們就報著學(xué)習(xí)的態(tài)度一起看看。

使用模塊

首先打開項目中 requirements.txt 文件,看下它都需要哪些模塊:

requests:類似 urllib ,主要用于向網(wǎng)站發(fā)送 HTTP 請求。 beautifulsoup4: HTML 解析器,用于將 HTML 文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu)。 pillow:Python 圖像處理標(biāo)準(zhǔn)庫,用于識別驗證碼。

配置文件

一般項目中我們都需要把一些可配置的內(nèi)容放到配置文件中,現(xiàn)在我們來看下這里主要配置項:

# 郵寄地所屬地區(qū)IDarea = 123456# 這是配置的商品的IDskuid = 6828101# 打碼服務(wù)器的地址captchaUrl = http://xxx/pic# 通知郵箱mail = xxxxxx@qq.com# cookie的設(shè)置cookies_String = shshshfpa21jsda8923892949204923123OK,有了配置文件,那我們就得有一段讀取配置文件的代碼,這段代碼實現(xiàn)將配置內(nèi)容加載到內(nèi)存中。import osimport configparser# 加載配置文件class Config(object): def __init__(self, config_file=’configDemo.ini’): self._path = os.path.join(os.getcwd(), config_file) if not os.path.exists(self._path): raise FileNotFoundError('No such file: config.ini') self._config = configparser.ConfigParser() self._config.read(self._path, encoding=’utf-8-sig’) self._configRaw = configparser.RawConfigParser() self._configRaw.read(self._path, encoding=’utf-8-sig’) def get(self, section, name): return self._config.get(section, name) def getRaw(self, section, name): return self._configRaw.get(section, name)

主程序模塊

我看 GitHub 上也有實現(xiàn)了運行程序后通過京東 App 掃碼登陸,然后再通過登陸 Cookie 訪問網(wǎng)站的,不過這里并沒有使用這種方式,畢竟我們打開瀏覽器開發(fā)者工具也能很容易獲取到登陸的 Cookie ,這里就是將 Cookie 直接放到配置文件里的方式。

# 主程序入口# 檢查是否存在要搶購的端口,然后進入循環(huán)掃描if len(skuids) != 1: logger.info(’請準(zhǔn)備一件商品’)skuId = skuids[0]flag = 1# 循環(huán)掃描該商品是否有貨,有庫存即會自動下單,無庫存則休眠后繼續(xù)掃描while (1): try: # 初始化校驗 if flag == 1: logger.info(’當(dāng)前是V3版本’) validate_cookies() # 校驗登陸狀態(tài) getUsername() # 獲取登陸用戶信息 select_all_cart_item() # 全選購物車 remove_item() # 刪除購物車 add_item_to_cart(skuId) # 增加搶購的商品 # 檢測配置文件修改 if int(time.time()) - configTime >= 60: check_Config() logger.info(’第’ + str(flag) + ’次 ’) # 計數(shù)器 flag += 1 # 檢查庫存模塊 inStockSkuid = check_stock(checksession, skuids, area) # 自動下單模塊 V3AutoBuy(inStockSkuid) # 休眠模塊 timesleep = random.randint(1, 3) / 10 time.sleep(timesleep) # 校驗是否還在登錄模塊 if flag % 100 == 0: V3check(skuId) except Exception as e: print(traceback.format_exc()) time.sleep(10)

以上就是該項目主程序,我已經(jīng)將代碼在原來基礎(chǔ)上增加了些注釋,可以讓我們更容易明白代碼的含義。下面我們就選擇幾個比較關(guān)鍵的代碼分析一下。

登陸狀態(tài)校驗

# 校驗登陸狀態(tài)def validate_cookies(): for flag in range(1, 3): try: targetURL = ’https://order.jd.com/center/list.action’ payload = { ’rid’: str(int(time.time() * 1000)), } resp = session.get(url=targetURL, params=payload, allow_redirects=False) if resp.status_code == requests.codes.OK: logger.info(’登錄成功’) return True else: logger.info(’第【%s】次請重新獲取cookie’, flag) time.sleep(5) continue except Exception as e: logger.info(’第【%s】次請重新獲取cookie’, flag) time.sleep(5) continue message.sendAny(’腳本登錄cookie失效了,請重新登錄’) sys.exit(1)

以上代碼是每次調(diào)用時,循環(huán)兩次獲取通過 session 獲取當(dāng)前登陸狀態(tài),如果兩次后依然失敗則退出程序。

添加商品到購物車

接下來我們再看下如果添加商品到購物車的,代碼如下:

def add_item_to_cart(sku_id): # 請求添加商品url url = ’https://cart.jd.com/gate.action’ payload = { ’pid’: sku_id, ’pcount’: 1, ’ptype’: 1, } # 返回結(jié)果 resp = session.get(url=url, params=payload) # 套裝商品加入購物車后直接跳轉(zhuǎn)到購物車頁面 if ’https://cart.jd.com/cart.action’ in resp.url: result = True else: # 普通商品成功加入購物車后會跳轉(zhuǎn)到提示 '商品已成功加入購物車!' 頁面 soup = BeautifulSoup(resp.text, 'html.parser') result = bool(soup.select(’h3.ftx-02’)) # [<h3 class='ftx-02'>商品已成功加入購物車!</h3>] if result: logger.info(’%s 已成功加入購物車’, sku_id) else: logger.error(’%s 添加到購物車失敗’, sku_id)

在這里,只是簡單幾行代碼就能將端口添加到購物車了,而且這里還區(qū)分了不同類型商品添加到購物車返回的頁面結(jié)果是不同的,所以要進行區(qū)別處理。

購買商品

將商品添加到購物車了,接下來我們就得提交結(jié)算頁了,也就是將商品提交到付款頁面,這段代碼有點多,我簡化了下并加了些注釋:

def submit_order(session, risk_control, sku_id, skuids, submit_Time, encryptClientInfo, is_Submit_captcha, payment_pwd, submit_captcha_text, submit_captcha_rid): # 提交端口的url url = ’https://trade.jd.com/shopping/order/submitOrder.action’ # 提交參數(shù) data = { ’overseaPurchaseCookies’: ’’, ’vendorRemarks’: ’[]’, ’submitOrderParam.sopNotPutInvoice’: ’false’, ’submitOrderParam.trackID’: ’TestTrackId’, ’submitOrderParam.ignorePriceChange’: ’0’, ’submitOrderParam.btSupport’: ’0’, ’riskControl’: risk_control, ’submitOrderParam.isBestCoupon’: 1, ’submitOrderParam.jxj’: 1, ’submitOrderParam.trackId’: ’9643cbd55bbbe103eef18a213e069eb0’, # Todo: need to get trackId ’submitOrderParam.needCheck’: 1, } # 如果用到京豆會需要輸入支付密碼 def encrypt_payment_pwd(payment_pwd): return ’’.join([’u3’ + x for x in payment_pwd]) # 校驗支付密碼 if len(payment_pwd) > 0: data[’submitOrderParam.payPassword’] = encrypt_payment_pwd(payment_pwd) # 請求報文頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/531.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://trade.jd.com/shopping/order/getOrderInfo.action', 'Connection': 'keep-alive', ’Host’: ’trade.jd.com’, } # 訂單提交會嘗試兩次 for count in range(1, 3): logger.info(’第[%s/%s]次嘗試提交訂單’, count, 3) try: # 可能會存在的校驗碼 if is_Submit_captcha: captcha_result = page_detail_captcha(session, encryptClientInfo) # 驗證碼服務(wù)錯誤 if not captcha_result: logger.error(’驗證碼服務(wù)異常’) continue data[’submitOrderParam.checkcodeTxt’] = submit_captcha_text data[’submitOrderParam.checkCodeRid’] = submit_captcha_rid # 提交訂單 resp = session.post(url=url, data=data, headers=headers) resp_json = json.loads(resp.text) logger.info(’本次提交訂單耗時[%s]毫秒’, str(int(time.time() * 1000) - submit_Time)) # 判斷是否提交成功 if resp_json.get(’success’): logger.info(’訂單提交成功! 訂單號:%s’, resp_json.get(’orderId’)) return True else: # 提交失敗返回的多種原因 resultMessage, result_code = resp_json.get(’message’), resp_json.get(’resultCode’) if result_code == 0: # self._save_invoice() if ’驗證碼不正確’ in resultMessage: resultMessage = resultMessage + ’(驗證碼錯誤)’ logger.info(’提交訂單驗證碼[錯誤]’) continue else: resultMessage = resultMessage + ’(下單商品可能為第三方商品,將切換為普通發(fā)票進行嘗試)’ elif result_code == 60077: resultMessage = resultMessage + ’(可能是購物車為空 或 未勾選購物車中商品)’ elif result_code == 60123: resultMessage = resultMessage + ’(需要在payment_pwd參數(shù)配置支付密碼)’ elif result_code == 60070: resultMessage = resultMessage + ’(省份不支持銷售)’ skuids.remove(sku_id) logger.info(’[%s]類型口罩不支持銷售’, sku_id) logger.info(’訂單提交失敗, 錯誤碼:%s, 返回信息:%s’, result_code, resultMessage) logger.info(resp_json) return False except Exception as e: print(traceback.format_exc()) continue

以上代碼實現(xiàn)了商品自動提交到結(jié)算頁面,這段明顯比添加購物車要復(fù)雜,果然跟錢有關(guān)的都不簡單。好了,到了結(jié)算頁面剩下就是付款了,這個就不需要再搶了,畢竟也沒人會搶著給你付錢的。

總結(jié)

本文為大家介紹了一個京東搶購的小工具,它實現(xiàn)了掃描是否有庫存,發(fā)現(xiàn)有庫存就自動下單,并且可以自動提交到結(jié)算頁面。而它所實現(xiàn)方式也并不算太復(fù)雜,進一步分析了它的部分代碼,有興趣的小伙伴可以去文末 GitHub 項目網(wǎng)址上了解更多,再次感謝開發(fā)者的付出和分享。

參考

GitHub項目網(wǎng)址:https://github.com/cycz/jdBuyMask

到此這篇關(guān)于使用 Python 在京東上搶口罩的思路詳解的文章就介紹到這了,更多相關(guān)Python 京東搶口罩內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: 京東 Python
相關(guān)文章:
主站蜘蛛池模板: 上海佳武自动化科技有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 密集柜_档案密集柜_智能密集架_密集柜厂家_密集架价格-智英伟业 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 太平洋亲子网_健康育儿 品质生活| 地磅-地秤-江阴/无锡地磅-江阴天亿计量设备有限公司_ | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 天津中都白癜风医院_天津白癜风医院_天津治疗白癜风 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 27PR跨境电商导航 | 专注外贸跨境电商 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 庭院灯_太阳能景观灯_草坪灯厂家_仿古壁灯-重庆恒投科技 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 神马影院-实时更新秒播 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 智能型高压核相仪-自动开口闪点测试仪-QJ41A电雷管测试仪|上海妙定 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 酒万铺-酒水招商-酒水代理| 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | RFID电子标签厂家-上海尼太普电子有限公司 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 |