Скрипт автоматической защиты цен Jingdong

задняя часть Python
Текст: такой-то белый рис
Источник: Python Technology [общедоступный идентификатор: pythonall]

Автоматизация застрахованных цен Jingdong

Наверняка все много чего купили по 618, а некоторые торговцы любят тайком снижать цены, из-за чего нам кажется, что мы потеряли 100 миллионов в одно мгновение. Сегодня я буду играть сценарий автоматической защиты цен Jingdong.

Получить список застрахованных цен

Во-первых, вам нужно войти на сайт JD.com, который указан в списке «618! Это было написано в Jingdong PC Version Grab Volume», вход в систему с помощью QR-кода, вы можете посмотреть.

Откройте страницу страховых цен JD.com (pcsitepp-fm.jd.com/), вам нужно получить красную рамку ниже…

Нажмите F12, чтобы перейти к следующему элементу страницы.

Сначала ставьте глобальные переменные

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'

session = requests.session()

Следующий код получает список заказов, которые могут быть застрахованы, включая номер заказа, номер артикула и количество товара.Существует 3 функции.Функция get_pin() получает значение PIN, функция get_order_list() зацикливается, чтобы получить список заказов, а функция skuProResultPC() определяет, не истек ли гарантийный срок заказа


def get_pin():
    """获取 PIN,用正则表达式从页面中取出"""

    url = "https://pcsitepp-fm.jd.com/"
    r = session.get(url)
    loginPin = re.findall('<input type="hidden" id="loginPin" value="(\w+)" />', r.text)
    pin = loginPin[0] if len(loginPin) > 0 else None
    return pin

def get_order_list(pin, page_num=1):
    """保价列表"""

    # 存放订单信息
    order_info = []
    # 存放数量
    count_dir = {}

    url = "https://pcsitepp-fm.jd.com/rest/pricepro/priceskusPull"
    data = {"page": page_num, "pageSize": 10}
    headers = {
        'User-Agent': user_agent,
        'Referer': 'https://pcsitepp-fm.jd.com/',
    }
    r = session.post(url, headers= headers, data=data)

    # 订单之间的分隔符
    orders = r.text.split('<tr class="sep-row"><td colspan="6"></td></tr>')
    orders.pop(0)

    for item in orders:
        # 订单号
        orderid = re.findall("订单号:(\d+)", item)
        # 数量
        count = re.findall('<span class="count">\n([\sx\d]+)</span>',item)
        # 商品的 sku和序号
        skuidAndSequences = re.findall("queryOrderSkuPriceParam\.skuidAndSequence\.push\(\"(\d+\,\d+)\"\)\;", item)
        newSkuidAndSequences = []

        # 商品的sku和订单商品的序号
        for ss in skuidAndSequences:

            # 判断订单保价是否超时
            if skuProResultPC(orderid[0], ss.split(',')[0], pin):

                newSkuidAndSequences.append(ss)
                if orderid[0] == '117403228624':
                    print(orderid[0])
                count_ss = count_html[int(ss.split(',')[1]) - 1]
                count = count_ss.replace('\t', '').replace('\n', '').replace('x', '')
                # 把 "订单号_sku" 当做 key
                count_dir[orderid[0] + '_' + ss.split(',')[0]] = count

        if newSkuidAndSequences:

            order_info.append({'orderid': orderid[0], 'skuidAndSequence': newSkuidAndSequences})

    if orders:
        """递归的方式获取所有的商品"""
        bill_info_sub, count_dir_sub = get_order_list(pin, page_num + 1)
        order_info.extend(bill_info_sub)
        count_dir.update(count_dir_sub)
    return order_info, count_dir

def skuProResultPC(orderId, skuId, pin):
    """判断订单是否保价超时"""

    url = "https://sitepp-fm.jd.com/rest/webserver/skuProResultPC"
    data = {
        "orderId": orderId,
        "skuId": skuId,
        "pin": pin
    }
    headers = {
        'User-Agent': user_agent,
        'Referer': 'https://pcsitepp-fm.jd.com/',
    }

    r = session.post(url, data=data, headers=headers)
    return 'overTime' not in r.text

Пример результата

订单信息:
[{'orderid': '118598307636', 'skuidAndSequence': ['851267,1']}, {'orderid': '118597642910', 'skuidAndSequence': ['4389188,1']}, {'orderid': '123625659522', 'skuidAndSequence': ['69699954984,1']}, {'orderid': '123539553604', 'skuidAndSequence': ['6839875,1']}, {'orderid': '123474129967', 'skuidAndSequence': ['50000970588,1']}]
商品数量
{'118598307636_851267': '10', '118597642910_4389188': '10', '123625659522_69699954984': '1', '123539553604_6839875': '4', '123474129967_50000970588': '1', '122842702447_31295640649': '1', '117403228624_31295640649': '1'}

Информация о продукте

При получении застрахованного прайс-листа был получен артикул продукта и URL-адрес продукта (например:item.Jingdong.com/6839875.htm…номер артикула, вы можете использовать номер артикула для получения информации о продукте.

Элемент анализа показывает, что в js страницы переменная pageConfig содержит все необходимые нам данные, которые можно получить с помощью регулярных выражений.

def get_product_info(skuId):
    """获商品信息"""
    info = {}
    url = "http://item.jd.com/%s.html" % skuId
    headers = {
        'User-Agent': user_agent,
        'Referer': 'https://pcsitepp-fm.jd.com/',
    }
    r = requests.get(url, headers=headers)
    pageConfig = re.findall("var pageConfig = \{([\s\S]+)\} catch\(e\) \{\}", r.text)
    cat = re.findall("cat: \[([\d,]+)\]", pageConfig[0])
    venderId = re.findall("venderId:(\d+)", pageConfig[0])
    shopId = re.findall("shopId:'(\d+)'", pageConfig[0])
    name = re.findall("name: '(.+)'", pageConfig[0])
    info['cat'] = cat[0] if len(cat) else ""
    info['venderId'] = venderId[0] if len(venderId) else ""
    info['shopId'] = shopId[0] if len(shopId) else ""
    info['skuId'] = skuId
    # 配送区域默认为北京
    info['area'] = '1_72_55653_0' 
    info['name'] = name[0]
    return info

Пример результата

{'cat': '1319,1525,7057', 'venderId': '1000015389', 'shopId': '1000015389', 'skuId': '6839875', 'area': '1_72_55653_0', 'name': '雀氏chiaus薄c引力纸尿裤小号S27片(4-8kg)尿不湿新生儿柔薄透气'}
{'cat': '1319,6313,15614', 'venderId': '10109166', 'shopId': '965779', 'skuId': '50000970588', 'area': '1_72_55653_0', 'name': '七彩博士 婴儿定型枕0-1岁 夏季透气天丝新生儿乳胶枕头宝宝U型枕新生儿用品 绿色天丝枕'}
{'cat': '1319,1527,1559', 'venderId': '107952', 'shopId': '106328', 'skuId': '31295640649', 'area': '1_72_55653_0', 'name': 'babycare婴儿纸巾抽纸新生儿面巾纸云柔巾宝宝纸巾 108抽*6包'}

Текущая цена товара

После получения информации о продукте отправьте данные в качестве параметров URL-адресу (c0.3.cn/stock), чтобы получить товар…

def get_product_price(product_info):

    url = "https://c0.3.cn/stock?skuId={}&area={}&venderId={}&buyNum=1&choseSuitSkuIds=&cat={}&extraParam={{%22originid%22:%221%22}}&fqsp=0&ch=1&callback=jQuery{}"\
        .format(product_info['skuId'], 
                product_info['area'], 
                product_info['venderId'], 
                product_info.get('cat', ''), 
                random.randint(1000000, 9999999))
    headers = {
        'User-Agent': user_agent,
        'Host': 'c0.3.cn',
        'Referer':  'https://item.jd.com/{0}.html'.format(product_info['skuId']),
    }
    r = session.get(url, headers=headers)
    data = parse_json(r.text)

    # 价格
    price = data.get("stock", {}).get("jdPrice", {}).get('p', 0)
    return float(price)

Купон доступен для продуктов

При совершении покупок на JD.com часто есть купоны на скидку со скидкой xx для полного xx и скидкой xx для полного xx.При покупке товаров без использования купонов вы можете обратиться в службу поддержки клиентов для защиты цены, взять купоны здесь и распечатать их.

def get_product_coupon(product_info, price):
    """优惠券列表"""
    result = []
    headers = {
        'User-Agent': user_agent,
        'Referer':  'https://item.jd.com/{0}.html'.format(product_info['skuId']),
    }
    url = 'https://cd.jd.com/promotion/v2?callback=jQuery{}&skuId={}&area={}&shopId={}&venderId={}&cat={}&isCanUseDQ=1&isCanUseJQ=1&platform=0&orgType=2&jdPrice={}&appid=1&_={}'\
        .format(
                str(random.randint(1000000, 9999999)),
                product_info['skuId'],
                product_info['area'],
                product_info['shopId'],
                product_info['venderId'],
                product_info['cat'].replace(',', '%2C'),
                price,
                str(int(time.time() * 1000)))
    r = session.get(url, headers=headers)
    data = parse_json(r.text)
    pickOneTag = data.get("prom", {}).get("pickOneTag")

    # 满减
    if pickOneTag:
        for tag in pickOneTag:
            result.append(tag.get('content'))

    # 打折
    skuCoupon = data.get('skuCoupon')
    if skuCoupon:
        for coupon in skuCoupon:
            if coupon.get('allDesc'):
                result.append(coupon.get('allDesc'))
            elif coupon.get('quota') and coupon.get('discount'):
                result.append("满" + str(coupon.get('quota')) + '减' + str(coupon.get('discount')))
    return result

Пример результата

['每满199元,可减100元现金,最多可减1000元', '满3件,总价打5折', '满105.0减5.0']

стоимость заказа

На данный момент текущая цена, купон и количество покупки продукта были получены, и необходимо получить цену заказа оставшегося заказа.Эта цена является суммой на первом рисунке. Мы используем номер заказа и номер артикула в качестве параметров для запроса цены заказа партиями.

def get_price_list(pin):
    '''获取下单价格、商品信息、当前价格、数量'''

    product_list = []

    # 取订单号,sku和商品数量
    queryOrderPriceParam,count_dir = get_order_list(pin)

    # 获取购买时的价格
    params = {"queryOrderPriceParam": json.dumps(queryOrderPriceParam)}
    r = session.post("https://sitepp-fm.jd.com/rest/webserver/getOrderListSkuPrice", data = params)
    orderList = r.json()

    for item in orderList:

        skuid = item.get("skuid")
        buyingjdprice = item.get("buyingjdprice")
        orderid = item.get("orderid")

        # 商品信息
        product_info = get_product_info(skuid)
        # 当前价格
        price = get_product_price(product_info)
        # 优惠券
        coupon = get_product_coupon(product_info, price)

        name = product_info['name']
        count = count_dir[orderid + '_' + skuid]

        product_list.append({'orderid': orderid, 'name': name, 'price': price, 'coupon': coupon, 'count': count, 'buyingjdprice': buyingjdprice})
    return product_list

Пример результата

[{'orderid': '123539553604', 'name': '雀氏chiaus薄c引力纸尿裤小号S27片(4-8kg)尿不湿新生儿柔薄透气', 'price': 27.9, 'coupon': ['购买1件可优惠换购热销商品', '满105.0减5.0', '满199减50', '满268减60'], 'count': '4', 'buyingjdprice': 27.0}, {'orderid': '123474129967', 'name': '七彩博士 婴儿定型枕0-1岁 夏季透气天丝新生儿乳胶枕头宝宝U型枕新生儿用品 绿色天丝枕', 'price': 69.0, 'coupon': ['06月16日 00:00 该商品参加跨店铺满折活动  ,满2件,总价打8折;满3件,总价打7折', '满98减5', '满105.0减5.0', '满178减10'], 'count': '1', 'buyingjdprice': 66.0}]

Подать заявку на ценовую защиту

Последний шаг — сравнить цены и подать заявку на защиту цен.Здесь есть две ситуации.Во-первых, вы можете напрямую подать заявку на защиту цен с помощью купонов, а во-вторых, есть купоны, которые можно распечатать на консоли, чтобы уведомить Пользователь.

def protect_protect_apply(product_list):
    """申请价格保护"""

    if len(product_list) == 0:
        return
    else:
        for item in product_list:
            result = '订单号:{},名称:{}, 数量:{}, 购买价格:{}, 当前价格:{}, 当前优惠:{}。'\
                .format(item['orderid'],
                        item['name'],
                        item['count'],
                        item['buyingjdprice'],
                        item['price'],
                        ' | '.join(item['coupon']))

            # 没有优惠券并且购买价格高于当前价格
            if len(item['coupon']) == 0 and item['buyingjdprice'] > item['price']:

                url = 'https://pcsitepp-fm.jd.com//rest/pricepro/skuProtectApply'
                data = {
                    "orderId": item['orderId'],
                    "orderCategory": "Others",
                    "skuId": item['skuId'],
                    "refundtype": 1
                }

                headers = {
                    'User-Agent': user_agent,
                    'Referer': 'https://pcsitepp-fm.jd.com/',
                    'accept': 'application/json, text/javascript, */*; q=0.01'
                }
                session.post(url, data=data, headers=headers)
                print(result + ' 已申请价格保护,请结果查看价格保护页面')

            elif len(item['coupon']) > 0:
                print(result + ' 在优惠券未申请自动价格保护,请联系客服申请')
    return

Пример результата

订单号:123539553604,名称:雀氏chiaus薄c引力纸尿裤小号S27片(4-8kg)尿不湿新生儿柔薄透气, 数量:4, 购买价格:27.0, 当前价格:27.9, 当前优惠:购买1件可优惠换购热销商品 | 满105.0减5.0 | 满199减50 | 满268减60。 在优惠券未申请自动价格保护,请联系客服申请
订单号:123474129967,名称:七彩博士 婴儿定型枕0-1岁 夏季透气天丝新生儿乳胶枕头宝宝U型枕新生儿用品 绿色天丝枕, 数量:1, 购买价格:66.0, 当前价格:69.0, 当前优惠:06月16日 00:00 该商品参加跨店铺满折活动  ,满2件,总价打8折;满3件,总价打7折 | 满98减5 | 满105.0减5.0 | 满178减10。 在优惠券未申请自动价格保护,请联系客服申请

Суммировать

Базовый код скрипта для автоматического страхования цен Jingdong завершен, и вы можете изменить код в соответствии со своими потребностями. Например, добавление запланированных задач, отправка электронных писем вместо печати и т. д.

Добро пожаловать в общедоступную учетную запись WeChat: технология Python, здесь у нас есть 100-дневное вводное практическое руководство, написанное нами, различные интересные практики программирования, различные учебные материалы и большая группа прекрасных друзей для обсуждения друг с другом.