摘要:標(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)訂單的解決方案想了解客戶(hù)就要收集銷(xiāo)售數(shù)據(jù)想必很多人都在美團(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)的。
重復(fù)勞動(dòng)就應(yīng)該讓機(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)。
當(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ù)人工操作流程 抽象出軟件執(zhí)行流程爬蟲(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)也是一樣,基本上都如下面的流程。
三家外賣(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
摘要:可以說(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)景的感知能力,還原...
閱讀 1663·2021-08-13 15:03
閱讀 2096·2019-08-30 15:54
閱讀 3554·2019-08-26 10:30
閱讀 1030·2019-08-26 10:22
閱讀 2756·2019-08-23 14:42
閱讀 1815·2019-08-22 11:16
閱讀 1046·2019-08-21 18:33
閱讀 3172·2019-08-21 17:28