欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python開發(fā)個(gè)京東上搶口罩的小實(shí)例(僅作技術(shù)研究學(xué)習(xí)使用)

 更新時(shí)間:2020年03月10日 15:22:10   投稿:wdc  
這篇文章主要介紹了使用Python開發(fā)個(gè)京東上搶口罩的小實(shí)例(僅作技術(shù)研究學(xué)習(xí)使用),需要的朋友可以參考下

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

使用模塊

requests:類似 urllib,主要用于向網(wǎng)站發(fā)送 HTTP 請(qǐng)求。

beautifulsoup4:HTML 解析器,用于將 HTML 文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹形結(jié)構(gòu)。

pillow:Python 圖像處理標(biāo)準(zhǔn)庫,用于識(shí)別驗(yàn)證碼。

配置文件

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

# 郵寄地所屬地區(qū)ID

area = 123456

# 這是配置的商品的ID

skuid = 6828101

# 打碼服務(wù)器的地址

captchaUrl = http://xxx/pic

# 通知郵箱

mail = xxxxxx@qq.com

# cookie的設(shè)置

cookies_String = shshshfpa21jsda8923892949204923123

OK,有了配置文件,那我們就得有一段讀取配置文件的代碼,這段代碼實(shí)現(xiàn)將配置內(nèi)容加載到內(nèi)存中。

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

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

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

# 校驗(yàn)登陸狀態(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】次請(qǐng)重新獲取cookie', flag)
        time.sleep(5)
        continue
    except Exception as e:
      logger.info('第【%s】次請(qǐng)重新獲取cookie', flag)
      time.sleep(5)
      continue
  message.sendAny('腳本登錄cookie失效了,請(qǐng)重新登錄')
  sys.exit(1)

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

添加商品到購物車

接下來我們?cè)倏聪氯绻砑由唐返劫徫镘嚨模a如下:

def add_item_to_cart(sku_id):
  # 請(qǐng)求添加商品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:
   # 普通商品成功加入購物車后會(huì)跳轉(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)

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

購買商品

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

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,
  }
  # 如果用到京豆會(huì)需要輸入支付密碼
  def encrypt_payment_pwd(payment_pwd):
    return ''.join(['u3' + x for x in payment_pwd])
  # 校驗(yàn)支付密碼
  if len(payment_pwd) > 0:
    data['submitOrderParam.payPassword'] = encrypt_payment_pwd(payment_pwd)
  # 請(qǐng)求報(bào)文頭
  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',
  }
  # 訂單提交會(huì)嘗試兩次
  for count in range(1, 3):
    logger.info('第[%s/%s]次嘗試提交訂單', count, 3)
    try:
      # 可能會(huì)存在的校驗(yàn)碼
      if is_Submit_captcha:
        captcha_result = page_detail_captcha(session, encryptClientInfo)
        # 驗(yàn)證碼服務(wù)錯(cuò)誤
        if not captcha_result:
          logger.error('驗(yàn)證碼服務(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('本次提交訂單耗時(shí)[%s]毫秒', str(int(time.time() * 1000) - submit_Time))
      # 判斷是否提交成功
      if resp_json.get('success'):
        logger.info('訂單提交成功! 訂單號(hào):%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 '驗(yàn)證碼不正確' in resultMessage:
            resultMessage = resultMessage + '(驗(yàn)證碼錯(cuò)誤)'
            logger.info('提交訂單驗(yàn)證碼[錯(cuò)誤]')
            continue
          else:
            resultMessage = resultMessage + '(下單商品可能為第三方商品,將切換為普通發(fā)票進(jìn)行嘗試)'
        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('訂單提交失敗, 錯(cuò)誤碼:%s, 返回信息:%s', result_code, resultMessage)
        logger.info(resp_json)
        return False
    except Exception as e:
      print(traceback.format_exc())
      continue

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

好了本文主要講的使用Python開發(fā)個(gè)京東上搶口罩的小實(shí)例只作技術(shù)研究學(xué)習(xí)使用,請(qǐng)不要胡亂使用。更多關(guān)于Python模塊requests,beautifulsoup4,pillow使用方法請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • 使用python解決化學(xué)問題的實(shí)用指南

    使用python解決化學(xué)問題的實(shí)用指南

    在當(dāng)今科學(xué)技術(shù)迅速發(fā)展的時(shí)代,計(jì)算機(jī)科學(xué)與各個(gè)學(xué)科的結(jié)合愈發(fā)緊密,尤其是在化學(xué)領(lǐng)域,本博文旨在探討如何利用Python解決一些常見的化學(xué)問題,包括構(gòu)建分子式、判斷化合價(jià)、解析分子式、平衡化學(xué)反應(yīng)方程式以及計(jì)算化合物的摩爾質(zhì)量等,需要的朋友可以參考下
    2024-10-10
  • python編程測(cè)試電腦開啟最大線程數(shù)實(shí)例代碼

    python編程測(cè)試電腦開啟最大線程數(shù)實(shí)例代碼

    這篇文章主要介紹了python編程測(cè)試電腦開啟最大線程數(shù)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 詳解Python中下劃線的5種含義

    詳解Python中下劃線的5種含義

    本文介紹了Python中單下劃線和雙下劃線的各種含義和命名約定,名稱修飾的工作原理,以及它如何影響你自己的Python類,感興趣的可以了解一下
    2021-07-07
  • 獨(dú)特的python循環(huán)語句

    獨(dú)特的python循環(huán)語句

    本文主要給大家介紹的是Python循環(huán)語句與其他編程語言中的循環(huán)語句不同的地方,非常的獨(dú)特,有需要的小伙伴可以參考下
    2016-11-11
  • pandas取出重復(fù)數(shù)據(jù)的方法

    pandas取出重復(fù)數(shù)據(jù)的方法

    今天小編就為大家分享一篇pandas取出重復(fù)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python實(shí)現(xiàn)的按要求生成手機(jī)號(hào)功能示例

    python實(shí)現(xiàn)的按要求生成手機(jī)號(hào)功能示例

    這篇文章主要介紹了python實(shí)現(xiàn)的按要求生成手機(jī)號(hào)功能,涉及Python流程控制、隨機(jī)數(shù)操作及數(shù)學(xué)運(yùn)算相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • python函數(shù)實(shí)例萬花筒實(shí)現(xiàn)過程

    python函數(shù)實(shí)例萬花筒實(shí)現(xiàn)過程

    這篇文章主要為大家介紹了python函數(shù)實(shí)例萬花筒實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python中random隨機(jī)函數(shù)詳解

    python中random隨機(jī)函數(shù)詳解

    大家好,本篇文章主要講的是python中random隨機(jī)函數(shù)詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Pytorch evaluation每次運(yùn)行結(jié)果不同的解決

    Pytorch evaluation每次運(yùn)行結(jié)果不同的解決

    今天小編就為大家分享一篇Pytorch evaluation每次運(yùn)行結(jié)果不同的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python內(nèi)建類型dict深入理解源碼學(xué)習(xí)

    Python內(nèi)建類型dict深入理解源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python內(nèi)建類型dict的深入理解及源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論