Python爬虫系列之美团优选商家端商品自动化管理(商品发布、商品排期、订单采集)

Python爬虫系列之美团优选商家端商品自动化管理(商品发布、商品排期、订单采集)

小程序爬虫接单、app爬虫接单、网页爬虫接单、接口定制、网站开发、小程序开发> 点击这里联系我们 <

微信请扫描下方二维码

Python爬虫系列之美团优选商家端商品自动化管理(商品发布、商品排期、订单采集)

代码仅供学习交流,请勿用于非法用途

直接上代码

# -*- coding:utf-8 -*-
import requests
import datetime
import time
import json
import os
import xlrd
import xlwt
from xlutils.copy import copy

'''
	功能点:
		1、美团优选商家端商品自动上架
		2、美团优选商家端商品自动排期
		3、美团优选商家端商品订单自动采集
		wx:walei5201314
'''

retry = 3
timeout = 20
excelTitle = ["productId", "skuId", "商品名称", "销售区域", "供货价", "库存", "销售单位", "销售日期", "生产日期", "市场价", "坑位"]
excelPwd = os.getcwd() + "/paiqi/"
if not os.path.exists(excelPwd):
    os.mkdir(excelPwd)
cookie = ""
mallPassportToken = ""


def initExcel(path):
    try:
        f = xlwt.Workbook()
        sheet1 = f.add_sheet(u'double', cell_overwrite_ok=True)
        for i in range(0, len(excelTitle)):
            sheet1.write(0, i, excelTitle[i])
        f.save(path)
        return True
    except Exception as e:
        return False


def writeExcel(data, path):
    print("===========================================================")
    print(data)
    print("===========================================================")
    try:
        workbook = xlrd.open_workbook(path)
        sheets = workbook.sheet_names()
        worksheet = workbook.sheet_by_name(sheets[0])
        rows_old = worksheet.nrows
        new_workbook = copy(workbook)
        new_worksheet = new_workbook.get_sheet(0)
        for j in range(0, len(data)):
            try:
                new_worksheet.write(rows_old, j, str(data[j]))
            except Exception as e:
                continue
        new_workbook.save(path)
        return True
    except Exception as e:
        pass
    return False


def dateTots(s):
    try:
        return int(time.mktime(time.strptime(s, "%Y/%m/%d"))) * 1000
    except Exception as e:
        return None


def getHtml(url, headers):
    for i in range(retry):
        try:
            resp = requests.get(url, headers=headers, timeout=timeout)
            return json.loads(resp.content.decode("utf-8"))
        except Exception as e:
            pass


def postHtml(url, data, headers):
    for i in range(retry):
        try:
            resp = requests.post(url, headers=headers, data=data, timeout=timeout)
            return json.loads(resp.content.decode("utf-8"))
        except Exception as e:
            pass


def updateCookie():
    global cookie
    global mallPassportToken
    try:
        with open("cookie.txt", "r", encoding="utf-8") as f:
            fs = f.readlines()
            cookie = fs[0]
    except Exception as e:
        print("启动错误:程序所在目录未读取到 cookie.txt 文件!")
        exit(0)


def mkdir(path):
    try:
        if os.path.exists(path):
            return True
        os.mkdir(path)
        return True
    except Exception as e:
        pass
    return False


def getCurrentTime():
    return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))


def getCurrentDate():
    return str(time.strftime('%Y-%m-%d', time.localtime(time.time())))


def getSechduleRegionList():
    url = "https://vss-grocery.meituan.com/api/vss/shepherd/schedule/VendorSkuScheduleQueryApiService/searchVendorHistoryScheduleRegion?version="
    headers = {
        "mall-passport-token": mallPassportToken,
        "Content-Type": "application/json",
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.2(0x18000231) NetType/4G Language/zh_CN",
        "mall-login-type": "passport-temp",
        "Referer": "https://servicewechat.com/sssssss5521212/148/page-frame.html",
        "Cookie": cookie
    }
    res = postHtml(url, {}, headers)
    try:
        return res['data']
    except Exception as e:
        pass


def tsToDate(ts):
    if ts:
        timeArray = time.localtime(int(ts))
        return str(time.strftime("%Y-%m-%d", timeArray))
    return ""


def getSellPosition(sellPosition):
    if sellPosition is None or sellPosition == "null":
        return ""
    elif str(sellPosition) == "4":
        return "万人团"
    elif str(sellPosition) == "3":
        return "秒杀"
    elif str(sellPosition) == "2":
        return "爆品"
    elif str(sellPosition) == "1":
        return "常规"
    return ""


def schduleParser(schduleStartTs, schduleEndTs, regionId, regionName, excelPath):
    url = "https://vss-grocery.meituan.com/api/vss/shepherd/schedule/VendorSkuScheduleQueryApiService/searchScheduleList?version="
    page = 1
    while True:
        data = {
            "paging": {
                "offset": (page - 1) * 10,
                "limit": 10
            },
            "skuName": "",
            "scheduleStatus": 0,
            "saleStartTime": schduleStartTs,
            "saleEndTime": schduleEndTs
        }
        headers = {
            "mall-passport-token": mallPassportToken,
            "Content-Type": "application/json",
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.2(0x18000231) NetType/4G Language/zh_CN",
            "mall-login-type": "passport-temp",
            "Referer": "https://servicewechat.com/wx40f6ce973eb82d6b/148/page-frame.html",
            "Cookie": cookie
        }
        res = postHtml(url, json.dumps(data), headers)
        try:
            scheduleList = res['data']['scheduleList']
            if scheduleList and len(scheduleList) > 0:
                for schedule in scheduleList:
                    try:
                        datas = []
                        datas.append(schedule['productId'])
                        datas.append(schedule['skuId'])
                        datas.append(schedule['name'])
                        datas.append(schedule['stock'])
                        datas.append(schedule['unitName'])
                        datas.append(tsToDate(str(schedule['saleDate'])[: 10]))
                        try:
                            datas.append(tsToDate(str(schedule['productProductionDate'])[: 10]) if schedule['productProductionDate'] else "")
                        except Exception as e:
                            datas.append("")
                        try:
                            datas.append(str(schedule['cutlinePrice']) if schedule['cutlinePrice'] else "")
                        except Exception as e:
                            datas.append("")
                        try:
                            datas.append(getSellPosition(str(schedule['sellPosition'])))
                        except Exception as e:
                            datas.append("")
                        writeExcel(datas, excelPath)
                    except Exception as e:
                        pass
                total = int(res['data']['total'])
                if total < 10:
                    break
                page += 1
            else:
                break
        except Exception as e:
            pass
    return False


def getBeforeDaysDate(days):
    threeDayAgo = (datetime.datetime.now() - datetime.timedelta(days=days))
    return dateTots(str(threeDayAgo.strftime('%Y/%m/%d')))


def main():
    updateCookie()
    excelPath = excelPwd + getCurrentDate() + ".xls"
    if status:
        startTs = getBeforeDaysDate(0)
        sechduleRegionList = getSechduleRegionList()
        if sechduleRegionList and len(sechduleRegionList) > 0:
            for sechduleRegion in sechduleRegionList:
                try:
                    schduleParser(startTs, endTs, str(sechduleRegion['regionId']), sechduleRegion['regionName'], excelPath)
                except Exception as e:
                    pass
        else:
            print("获取销售地区失败,请检查是否登录过期!")
    else:
        print("excel:%s 创建失败!请检查excel是否处于打开状态,如果是请关闭!" % excelPath)


if __name__ == '__main__':
    main()

上一篇:跟随我在oracle学习php(57)


下一篇:Python学习笔记:异常处理