首頁 > 軟體

利用Python通過商品條形碼查詢商品資訊的實現範例

2022-07-18 18:03:42

提前說明,由於博文重在講解,程式碼一體性有一定程度的破壞。如想要省事需要完整程式碼請至一下連結下載:完整程式碼下載

一 商品條形碼

平日大家會購買許許多多的商品,無論是飲料、食品、藥品、日用品等在商品的包裝上都會有條形碼。

商品條形碼包括零售商品、非零售商品、物流單元、位置的程式碼和條碼標識。我國採用國際通用的商品程式碼及條碼標識體系,推廣應用商品條形碼,建立我國的商品標識系統。

零售商品是指在零售端通過POS掃描結算的商品。其條碼標識由全球貿易專案程式碼(GTIN)及其對應的條碼符號組成。零售商品的條碼標識主要採用EAN/UPC條碼。一聽啤酒、一瓶洗髮水和一瓶護髮素的組合包裝都可以作為一項零售商品賣給最終消費者。

總的來講就是每一種在市面流通的商品都會有屬於自己商品條形碼。

二 查詢商品條形碼的目的

從技術方面來講,本次利用Python通過商品條形碼查詢商品資訊是為了練習爬蟲技術。
從生活方面來講,本次專案可以查詢購買商品的資訊,確保商品來源與成分可靠。

三 Python實現

3.1 爬取網站介紹

網站連結如下:條形碼查詢網站
網站截圖如下:

可以看到在該網站中輸入某一商品的條形碼,後輸入驗證碼。點選查詢即可查詢到商品資訊。以“6901028001915”為例,進行一次查詢,截圖如下:

3.2 python程式碼實現

3.2.1 紀錄檔模組

為儲存操作記錄在專案中新增紀錄檔模組,程式碼如下:

import logging
import logging.handlers
'''
紀錄檔模組
'''
LOG_FILENAME = 'msg_seckill.log'
logger = logging.getLogger()


def set_logger():
    logger.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(process)d-%(threadName)s - '
                                  '%(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    file_handler = logging.handlers.RotatingFileHandler(
        LOG_FILENAME, maxBytes=10485760, backupCount=5, encoding="utf-8")
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

set_logger()

3.2.2 查詢模組

有上面的截圖可以看到,網站查詢需要數位驗證碼驗證,因此這裡使用ddddocr包來識別驗證碼。匯入相應的包:

from logging import fatal
import ddddocr
import requests
import json
import os
import time
import sys
from msg_logger import logger

接下來是專案的主體程式碼,整個操作邏輯程式碼註釋中有詳細講解:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
path = os.path.abspath(os.path.dirname(sys.argv[0]))

# json化
def parse_json(s):
    begin = s.find('{')
    end = s.rfind('}') + 1
    return json.loads(s[begin:end])

# 建立目錄
def mkdir(path):
     # 去除首位空格
    path = path.strip()
    # 去除尾部  符號
    path = path.rstrip("\")
    # 判斷路徑是否存在
    isExists=os.path.exists(path)
    # 判斷結果
    if not isExists:
        os.makedirs(path)
        logger.info(path + ' 建立成功')
        return True
    else:
        # 如果目錄存在則不建立,並提示目錄已存在
        logger.info(path + ' 目錄已存在')
        return False

# 爬取 "tiaoma.cnaidc.com" 來查詢商品資訊
def requestT1(shop_id):
    url = 'http://tiaoma.cnaidc.com'
    s = requests.session()

    # 獲取驗證碼
    img_data  = s.get(url + '/index/verify.html?time=',  headers=headers).content
    with open('verification_code.png','wb') as v:
        v.write(img_data)

    # 解驗證碼
    ocr = ddddocr.DdddOcr()
    with open('verification_code.png', 'rb') as f:
        img_bytes = f.read()
    code = ocr.classification(img_bytes)
    logger.info('當前驗證碼為 ' + code)
    # 請求介面引數
    data = {"code": shop_id, "verify": code}
    resp = s.post(url + '/index/search.html',headers=headers,data=data)
    resp_json = parse_json(resp.text)
    logger.info(resp_json)

    # 判斷是否查詢成功
    if resp_json['msg'] == '查詢成功' and resp_json['json'].get('code_img'):
        # 儲存商品圖片
        img_url = ''
        if resp_json['json']['code_img'].find('http') == -1:
            img_url =  url + resp_json['json']['code_img']
        else:
            img_url =  resp_json['json']['code_img']

        try:
            shop_img_data  = s.get(img_url,  headers=headers, timeout=10,).content
             # 新建目錄
            mkdir(path + '\' + shop_id)
            localtime = time.strftime("%Y%m%d%H%M%S", time.localtime())
            # 儲存圖片
            with open(path + '\' + shop_id + '\' + str(localtime) +'.png','wb') as v:
                v.write(shop_img_data)
            logger.info(path + '\' + shop_id + '\' + str(localtime) +'.png')
        except requests.exceptions.ConnectionError:
            logger.info('存取圖片URL出現錯誤!') 
       
    if resp_json['msg'] == '驗證碼錯誤':
        requestT1(shop_id)

    return resp_json

3.2.3 執行結果

if __name__ == "__main__":
    try:
        dict_info = requestT1('6901028001915')['json']
        print(dict_info['code_sn'])
        print(dict_info['code_name'])
        print(dict_info['code_company'])
        print(dict_info['code_address'])
        print(dict_info['code_price'])
    except:
        print('商品無法查詢!')

嘗試執行程式碼,以“6901028001915”為例,檢視執行結果:

可見商品的資訊成功查詢出來。

到此這篇關於利用Python通過商品條形碼查詢商品資訊的文章就介紹到這了,更多相關利用Python通過商品條形碼查詢商品資訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com