成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

如何爬取外賣(mài)平臺(tái)商家訂單

wenhai.he / 3348人閱讀

摘要:標(biāo)簽餐飲外賣(mài),美團(tuán),餓了么,百度,爬蟲(chóng),數(shù)據(jù)挖掘爬蟲(chóng)定時(shí)抓取外賣(mài)平臺(tái)訂單的解決方案想必很多人都在美團(tuán),餓了么,百度上點(diǎn)過(guò)外賣(mài)吧,每家平臺(tái)都不定期的發(fā)力進(jìn)行各種瘋狂打折活動(dòng),好多人都是三個(gè)都安裝的一起比價(jià)的策略。

標(biāo)簽:餐飲外賣(mài),美團(tuán),餓了么,百度,爬蟲(chóng),數(shù)據(jù)挖掘

爬蟲(chóng)定時(shí)抓取外賣(mài)平臺(tái)訂單的解決方案

想必很多人都在美團(tuán),餓了么,百度上點(diǎn)過(guò)外賣(mài)吧,每家平臺(tái)都不定期的發(fā)力進(jìn)行各種瘋狂打折活動(dòng),好多人都是 三個(gè)app都安裝的一起比價(jià)的策略。而作為大的餐飲企業(yè)為了擴(kuò)大自己的訂單量,也是三家都會(huì)上自己的商戶(hù),但是這 三家平臺(tái)因?yàn)楦?jìng)爭(zhēng)的原因都不支持訂單批量導(dǎo)出功能。這個(gè)爬蟲(chóng)程序就是這個(gè)原因而開(kāi)發(fā)出來(lái)的。

想了解客戶(hù)就要收集銷(xiāo)售數(shù)據(jù)

定位客戶(hù),了解客戶(hù)有很多種渠道,其中收集訂單信息是比較客觀的數(shù)據(jù),我們能從中知道客戶(hù)的年齡分布,地理位 置分布,喜歡的口味,消費(fèi)的層次,購(gòu)買(mǎi)套餐后還喜歡哪些單點(diǎn)等等問(wèn)題都能逐漸積累的訂單數(shù)據(jù)中挖掘出來(lái), 剛開(kāi) 始這項(xiàng)艱巨的工作是由運(yùn)營(yíng)的童鞋們開(kāi)始的, 她們每天兢兢業(yè)業(yè)的Ctrl+C , Ctrl+V的拷貝下來(lái)百度,美團(tuán),餓了么 后臺(tái)數(shù)據(jù),然后Excel大神生成各種報(bào)表,供我們做分析。 但平淡的日子總是漸漸枯燥起來(lái),隨著訂單越來(lái)越來(lái),公 司配送點(diǎn)也越來(lái)越多, (三個(gè)外賣(mài)平臺(tái) +自有微信商城) X 配送點(diǎn) X 每個(gè)配送點(diǎn)的訂單的數(shù)據(jù)就是運(yùn)營(yíng)童鞋們的 噩夢(mèng)。

重復(fù)勞動(dòng)就應(yīng)該讓機(jī)器去做

當(dāng)運(yùn)維童鞋正在苦逼復(fù)制各種訂單數(shù)據(jù)時(shí), 我已經(jīng)想到用爬蟲(chóng)技術(shù)爬取外賣(mài)平臺(tái)上的訂單了, 這件事并不能,之前 學(xué)習(xí)Nodejs時(shí)候,還寫(xiě)過(guò)一個(gè)爬蟲(chóng)在@煎蛋爬取無(wú)聊圖和美女圖呢:>于是開(kāi)始調(diào)研這三家外 賣(mài)平臺(tái)的后臺(tái)系統(tǒng)。

三家后臺(tái)采用的頁(yè)面技術(shù)

平臺(tái) 后臺(tái)展現(xiàn) 頁(yè)面使用的數(shù)據(jù)接口 可能的抓取方案
美團(tuán)外賣(mài) 網(wǎng)頁(yè) and 桌面程序 restful api 請(qǐng)求獲取json 或者抓取網(wǎng)頁(yè)
百度外賣(mài) 桌面程序內(nèi)嵌webkit 動(dòng)態(tài)頁(yè)面 抓取網(wǎng)頁(yè)
餓了么 桌面程序內(nèi)嵌webkit restful api 請(qǐng)求獲取json 或者抓取網(wǎng)頁(yè)

其中百度外賣(mài)后臺(tái)頁(yè)面非常{{BANNED}},采用動(dòng)態(tài)頁(yè)面生成頁(yè)面還能接受, 訂單部分?jǐn)?shù)據(jù)特意生成 一大段js代碼,

由頁(yè)面執(zhí)行渲染后才顯示出來(lái),這也是后來(lái)在抓取時(shí)一個(gè)坑。

如何抓取數(shù)據(jù)

爬蟲(chóng)技術(shù)簡(jiǎn)單說(shuō)就是用程序模擬人在上網(wǎng),瀏覽需要的網(wǎng)頁(yè),然后把網(wǎng)頁(yè)上需要的內(nèi)容下載提取出來(lái), 轉(zhuǎn)換成結(jié)構(gòu) 化的數(shù)據(jù)保存起來(lái)。這些外賣(mài)后臺(tái)也是一樣,基本上都如下面的流程。

人工操作流程

抽象出軟件執(zhí)行流程

三家外賣(mài)平臺(tái)抓取的細(xì)節(jié)都不一樣,但總體上可以用下面的方式表示

更細(xì)化一下的表示

核心代碼為
/*  爬蟲(chóng)任務(wù)的父類(lèi)
*   定義抓取流程,各步驟的內(nèi)容
*   抽取出統(tǒng)一的json to csv生成代碼
*/
class FetchTask {
    /*  account:{username:String,password:String}
        option:{beginTime:moment,endTime:moment}
    */
    constructor(account,option) {
        this.account = account;
        let end = moment().subtract(1,"days").endOf("day");
        let begin = moment().subtract(option.beforeDays, "days").startOf("day");
        logger.info(`Start fetch ${account.name} from ${begin.format("YYYY-MM-DD")} to ${end.format("YYYY-MM-DD")} orders`);
        this.option = {
            beginTime: begin,
            endTime: end
        };
        this.columns = {};
    }
    //  任務(wù)執(zhí)行主方法 
    run() {
        return this.preFetch().then(this.fetch.bind(this)).then(this.postFetch.bind(this));
    }
    // 抓取前的準(zhǔn)備工作
    preFetch() {
        logger.info(`preFetch ${this.account.name}`);
        return this.login();
    }
    // 保存登錄憑證
    setToken(token){
        this.token = token;
        logger.info(`${this.account.name} gets token :${JSON.stringify(token)}`);
    }
    //  執(zhí)行抓取
    fetch() {
        logger.info(`fetch ${this.account.name}`);
        return this.fetchPageAmount().then(this.fetchPages.bind(this));
    }
    //  登錄步驟需要子類(lèi)實(shí)現(xiàn)
    login() {
        return;
    }
    //  抓取分頁(yè)總數(shù)
    fetchPageAmount(){
        return 0;
    }
    //  抓取所有分頁(yè)上的數(shù)據(jù)
    fetchPages(pageAmount) {
        let tasks = [];
        for (let pageNum = 1; pageNum <= pageAmount; pageNum++) {
            tasks.push(this.fetchPage(pageNum));
        }
        return promise.all(tasks).then((result)=> {
            return _.flatten(result);
        });
    }
    //  抓取之后的操作,主要是對(duì)原始數(shù)據(jù)轉(zhuǎn)換,格式轉(zhuǎn)換,數(shù)據(jù)輸出
    postFetch(orders){
        logger.info(`postFetch ${this.account.name}`);
        return this.convertToReport(orders).then(this.convertToCSV.bind(this));
    }
    //  原始數(shù)據(jù)格式轉(zhuǎn)換
    convertToReport(orders){
        return orders;
    }
    //  在postFetch中將數(shù)據(jù)轉(zhuǎn)換成csv格式并生成文件
    convertToCSV(orders) {
        logger.info(`convertToCSV ${this.account.name}`);
        let option = {
            header: true,
            columns: this.columns,
            quotedString: true
        };
        var begin = this.option.beginTime.format("YYYY-MM-DD");
        var end = this.option.endTime.format("YYYY-MM-DD");
        let reportFile = this.account.name + begin + "_" + end + "_" + uuid.v4().substr(-4, 4) + ".csv";
        let reportPath = path.resolve(__dirname, "../temp", reportFile);
        return new promise(function (resolve, reject) {
            stringify(orders, option, function (err, output) {
                if (err) {
                    reject(err);
                }
                fs.appendFile(reportPath, output, {
                    encoding: "utf8",
                    flag: "w+"
                }, function (err) {
                    if (err) return reject(err);
                    logger.info("Generate a report names " + reportPath);
                    resolve(reportPath);
                });
            });
        });
    }
}
module.exports = FetchTask;

每天凌晨6點(diǎn)鐘自動(dòng)執(zhí)行抓取任務(wù),定時(shí)執(zhí)行是由later定時(shí)庫(kù)實(shí)現(xiàn)的

const ElemeTask = require("./lib/eleme_task");
const BaiduTask = require("./lib/baidu_task");
const MeituanTask = require("./lib/meituan_task");
const mail = require("./lib/mail");
const logger = require("./lib/logger");
const promise = require("bluebird");
const moment = require("moment");
const config = require("config");
const accounts = config.get("account");
const later = require("later");

function startFetch() {
    let option = {beforeDays: 1};
    let tasks = [];
    accounts.forEach((account)=> {
        switch (account.type) {
            case "meituan":
                tasks.push(new MeituanTask(account, option).run());
                break;
            case "eleme":
                tasks.push(new ElemeTask(account,option).run());
                break;
            case "baidu":
                tasks.push(new BaiduTask(account,option).run());
                break;
        }
    });
    promise.all(tasks).then((files)=> {
        logger.info("Will send files :" + files);
        mail.sendMail(option, files);
    }).catch((err)=> {
        logger.error(err);
    });
}
later.date.localTime();
let schedule = later.parse.recur().on(6).hour();
later.setInterval(startFetch,schedule);
logger.info("Waimai Crawler is running");

按這個(gè)結(jié)構(gòu)就是可以實(shí)現(xiàn)各個(gè)平臺(tái)上的抓取任務(wù)了,因?yàn)椴幌氚盐恼聦?xiě)成代碼review,細(xì)節(jié)可以直接
訪問(wèn)waimai-crawler

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79815.html

相關(guān)文章

  • 機(jī)器學(xué)習(xí)在美團(tuán)配送系統(tǒng)的實(shí)踐:用技術(shù)還原真實(shí)世界

    摘要:可以說(shuō),美團(tuán)要建設(shè)的就是配送系統(tǒng)的超級(jí)大腦。美團(tuán)超腦配送系統(tǒng)目前互聯(lián)網(wǎng)技術(shù),很大部分還是針對(duì)線(xiàn)上產(chǎn)品和系統(tǒng)研發(fā),整個(gè)流程可以在線(xiàn)上全部完成,而這也正是配送技術(shù)最大的不同和挑戰(zhàn)。 在2018 AI開(kāi)發(fā)者大會(huì)(AI NEXTCon)上,美團(tuán)配送AI方向負(fù)責(zé)人何仁清,分享了美團(tuán)在即時(shí)配送領(lǐng)域中機(jī)器學(xué)習(xí)技術(shù)的最新進(jìn)展,以及如何通過(guò)大數(shù)據(jù)和機(jī)器學(xué)習(xí)手段,建立對(duì)線(xiàn)下真實(shí)世界各種場(chǎng)景的感知能力,還原...

    hearaway 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<