紐約蹭飯手冊:怎樣利用Python和自動化腳本在紐約省錢又省心?

在家作飯不下館子能夠減小開支已是公開的祕密。但做爲一名美食天堂的國民,不下館子幾乎是不可能的。正則表達式

處處都是火鍋店、燒烤餐廳或美味披薩店,瞅一眼這些美食,就足以摧毀你們省錢的意志力。算法

若是你即不想讓錢包當成受害者,又不想放棄美妙的用餐體驗,就得本身「造」錢來支付飯費。編程

來,跟隨做者的腳步,讓你走上了各類中餐、西餐、中西餐的蹭飯之路。dom

本文做者NBC環球的數據工程師Chris Buetti,2017年畢業於維克森林大學。機器學習

首先咱們的目標是到最棒的餐廳吃到霸王餐。這是個技術活,達成這個目標有兩種方法:要麼讓代碼作這件事,要麼有大量的空閒時間。編程語言

本文會簡要介紹一下使用的技術和編程語言,但不會給出代碼或相關內容。會解釋怎樣使用邏輯迴歸,隨機森林,AWS和自動化腳本,但都不會深刻。本文更多的是理論而非實踐。工具

若是你是一個非技術人,這篇文章仍然適合你,只不過要多花費一點時間和精力。文章裏的這些方法大部分都很枯燥,這就是爲何我要用自動化腳原本實現它們的緣由。學習

走起,我將從結果開始,而後解釋我是如何作到的。測試

我作了什麼優化

在今天這個數字時代,Instagram用戶數是一種財富。像傳聞說的那樣能夠經過大量的粉絲來賺錢,或者對我來講,用粉絲來支付個人飯費,這就是我所作的。

我建立了Instagram我的首頁,展現紐約的輪廓,標誌性景點,優雅摩天大樓的圖片,等等。這使我在紐約地區積累了超過25,000名粉絲,而且仍在快速增加。

我經過Instagram發消息或電子郵件聯繫當地的餐館,用在主頁上向粉絲髮布評論來換取免費餐或至少是用餐折扣。

幾乎全部我聯繫的餐館都給了我免費試吃的機會或優惠卡。大多數餐館都有市場營銷預算,因此他們很樂意爲我提供免費的用餐體驗,以便開展促銷活動。有時優惠太多我只好送一些給朋友和家人。

這原本沒什麼稀奇,關鍵在於我將整個過程自動化了,個人意思是100%不用手動操做了。我編寫的代碼能夠自動找到圖片或視頻,製做標題,添加主題標籤,標記圖片或視頻出自哪裏,還能過濾垃圾郵件,發帖,關注用戶和取消關注,點贊,監控個人收件箱,最重要的是自動向與可能須要促銷的餐館發消息和電子郵件。

自從有了這套代碼,我甚至都不須要真正登陸該賬戶,根本不用花時間在這上面。它本質上是一個機器人,但普通人沒法分辨,由於它的行爲和人同樣。做爲它的開發者,我能夠坐下來欣賞它(和個人)工做。

我是怎麼作到的

我會帶你從頭到底瞭解我在這個過程當中所作的每一件事。其中一些事看似常識,但當你用自動化系統來完成這些事的時候,細節就變得很重要。該過程可分爲三個階段:內容共享,黑客式增加以及銷售和促銷。

內容共享

其實,個人賬戶所發佈的內容都不是我原創的,而是我從新分享其餘人的內容,但有註明來源。若是有人說我侵權,要我撤下他們的照片,我會立刻照作。但由於我在分享裏帶了他們的主頁的連接,因此他們歷來都只有感激我。

天天屢次發佈內容是必須的。這是Instagram算法肯定你的曝光度的主要因素之一(經過「探索頁面」)。天天發帖,特別是在天天「高峯時段」發帖,很是單調乏味。大多數人作了幾周就會放棄,甚至有時一兩天漏發也會致使曝光度降低。所以,將內容收集和分享過程自動化是頗有必要的。

獲取圖片和視頻

我最初考慮用爬蟲從Google圖片或社交新聞站點Reddit上抓取圖片。我遇到的最大的困難之一就是Instagram對所發佈圖片的大小有特別要求,最好是「方形」圖片,也就是寬度等於高度,所以發佈非正方形的圖片會被拒絕。這使得檢索圖片變得很是艱鉅。

我最終決定直接從其餘Instagram帖子中搜索,由於圖片大小符合要求,並且還能夠準確知道其來源,這一點在自動化腳本里很是有用。

我收集了50個Instagram賬戶,這些賬戶發佈了許多關於紐約的優質圖片。我用開源軟件編寫了一個爬蟲來下載這些賬戶上傳的帖子。除了下載文字內容外,還有圖片和一堆元數據,如標題、點贊數和位置等。我將爬蟲設置爲天天凌晨3點或當個人圖片庫爲空時運行。

這樣,我把全部內容都集中存儲在一個地方,包含正確格式的各類內容。

自動肯定什麼是「好」或「壞」的內容

並不是全部在Instagram上發佈的內容都值得從新分享。有不少賣東西的帖子,罵人的貼子,或者有些內容跟我想要的不相關。如下面這兩篇帖子爲例:

這兩個帖子來自同一個紐約的Instagram賬戶。左邊帖子發佈的是天然風光,我很樂意把它從新分享在個人主頁。右邊的廣告沒有任何上下文,標題分兩行,這其實是在給一個紐約的手機應用打廣告。

若是我把它放在個人主頁上,那會就顯得讓人困擾,與個人主頁顯得格格不入。你能夠看到點贊數量的差別-8200對1000。我須要腳本可以自動過濾掉右邊的帖子,並從新分享左邊的帖子。

所以,我不能盲目地從新分享我提取到的全部內容。但我又但願這是一個自動化過程。因此我須要建立一個算法,能夠取其精華去其糟粕。算法的第一部分包括一些hard-coded規則,第二部分是機器學習模型。

算法的第一部分——hard-coded規則

我作的第一件事是根據元數據中的特定規則優化個人inventory。在這個過程當中,我必須保持嚴謹。若是出現了一個警告,那麼圖片就廢了。

理論上,我能夠抓取到不少內容,但若是算法在個人頁面上發佈了不合適的內容,那麼在我發現以前可能已經有不少人看到了。

我接下來要作的是看看評論是否不可用。個人經驗是,不可用的評論大多與有爭議的帖子有關,並不值得我冒這個風險。

我要作的最後一件事是看圖片中是否標記了多我的。不少時候,圖片中的一個標籤是標記它來自哪裏,這其實是有用的。可是若是圖片有多個標籤,那麼就會出現混淆。

根據這些規則,我能夠排除大部分垃圾帖子和不受歡迎的帖子。然而,不能僅僅依據是否推銷東西來判斷一篇帖子是否具備高質量內容。此外,個人hard-coded規則可能仍然會遺漏一些銷售類的廣告帖子,所以我想在完成第一部分後再過一個二級模型。

第二部分——機器學習模型

通過第一部分算法過濾——hard-coded規則,我發現仍然存在一些垃圾帖子。我不打算人工手動剔除它們,我計劃將這個過程徹底自動化。

每一個帖子上都有大量的元數據,包括點贊數,標題,發佈時間等等。我最初的目的是嘗試預測哪些圖片會得到最多的點贊。然而,很明顯,網紅博主天然會得到更多的點贊,因此這不能做爲準確的判斷依據。

後來個人想法是讓響應變量等同於點贊率(即點贊數/粉絲數),並嘗試進行預測。但在觀察每張圖片及其點贊率後,我認爲點贊率和圖片質量的相關性不大。我不認爲那些點贊率高的照片就是高質量照片。

一些不知名的攝影師發佈的圖片內容並不必定比網紅博主差,即使網紅擁有更高點贊率。我決定用分類模型替換回歸模型來評價圖片內容的質量,判斷其是否能夠發佈——一個簡單的是或否問題。

在查看其餘元數據以前,我抓取了大量照片並把每張照片手工標記爲0(差)或1(好)。這是很是主觀的判斷,能夠說我是根據本身的主觀判斷製做模型。但我認爲個人判斷應該和大部分人同樣。

我生成了數據集。響應變量爲0或1(即差或好),具備許多特徵。每篇帖子的元數據能夠提供我如下信息:

從這七個解釋變量裏,我改變了一些我認爲有用的特徵。例如,我改變了評論的數量和點贊率。我從標題中提取了帶「#」號的標籤的數量,並將其做爲column,並對標題中提到的用戶數量進行了相同的操做。

我對其他的標題進行向量化,用於後續的天然語言處理。向量化是刪除外圍詞(如「the」,「and」),並將剩餘詞轉換爲能夠用於數學分析的數字字段。我獲得瞭如下數據:

我使用了許多分類算法,例如支持向量機(Support Vector Machines)和隨機森林樹(Random Forests),但最終是採用了簡單的邏輯迴歸算法(Logistic Regression)。

我認爲有時候最簡單的答案就是正確的答案。不管我採用哪一種方式處理數據,邏輯迴歸算法在個人測試集上都表現最好。

與其餘分類算法不一樣,我能夠在進行預測時設置閾值的得分(threshold score)。分類算法一般輸出二進制類(在個人算法裏是0或1),但Logistic Regression實際上會輸出0到1之間的小數。

例如,它可能將帖子評爲0.83或0.12。人們一般將閾值設置爲0.5,並將全部大於0.5的定爲1,其他的定爲0,但這取決於具體使用的案例。這個過程很關鍵,因此我將個人閾值設爲0.9,並低於該基準的內容視做無用的。

在部署個人模型以後,圖片和視頻首先通過一套嚴格的規則清理,而後再通過Logistic Regression篩選出優秀的素材。如今我可以繼續爲每一個帖子添加說明和打分。

自動化說明和打分

我如今有一個自動收集相關內容並刪除垃圾圖像的系統——但我尚未完成。

若是你以前用過Instagram,那麼你應該知道每一個帖子的圖片或視頻下方都有文字說明。但由於我實際上看不到這些圖片,也沒有時間給它們所有加上說明,因此我須要製做一個通用標題。

我作的第一件事是製做最終模板。它看起來像這樣:

接着我要將代碼填進去。讓咱們一個個來看怎麼填。

標題

我建立了一個文本文件,其中包含許多預約義的通用標題,能夠匹配任何的圖片。這些標題能夠是關於紐約的名言、通用問題或是簡單的讚美,例如:

對於每一個帖子,標題是隨機選擇的。我有許多備選的標題,根本不用擔憂某個標題會頻繁出現。對於咱們的例子,咱們能夠選擇 「Who can name this spot?」。

來源標記

自動標記圖片資源的來源可不是件容易的事情。一般狀況下,一個Instagram帳號頁面上的圖片並不表明這帳號擁有圖片的版權。這樣的帳號可能也是從新分享的內容,會在頁面的標題中或圖片標籤裏標記圖片來源。

對此,我決定不管如何先標註上圖片的第一來源;若是我能夠根據其餘信息找出到圖片的原始出處,那麼我就繼續在後面添加。經過這種方法,我基本上就能夠標誌出全部圖片素材了。

首先咱們看一下@likenewyorkcity的這個帖子,儘管是這個帳號分享出了這張圖片,但圖片中的標籤和頁面標題上@geoffrey.parry纔是圖片的真正版權擁有者。

理論上我但願個人代碼能夠在識別這張圖片後得出這樣一條輸出:

第一步很簡單,我只須要直接標註出出現的帳號便可,但第二步就沒那麼容易了。

我經過REGEX(正則表達式工具)匹配一些相似於「by」或者「photo」的關鍵詞,而後找到緊跟在關鍵詞後的「@」標識,經過這種方法抓取的用戶名便被我標註成圖片來源的第二部分。

若是標題中沒有出現這些關鍵詞,我便檢查是否有人爲圖片打了標籤,這些打了標籤的帳號便被我「默認」爲我該標註出的對象了。儘管這種簡單粗暴的方法並非那麼完美,但至少比不這麼「默認」強上好幾倍,不失爲一種值得嘗試的方法。

我老是能精準地標註出圖片的正確來源。實際上,人們還屢次在個人圖片下評論道「感謝分享!」(接下來展現出的圖片即是一個很好的例子)

標籤

Instagram容許用戶爲圖片打上30個主題標籤,圖片便會在相應的主題下展現。因而我建立了一個包含100多個相關主題的文件:

剛開始我每次都會隨機在其中選擇30個主題,並且不久後,我能夠根據實際結果比較出哪些主題標籤會獲得更多「贊」。

模板填充

通過以上這三個步驟後,我即可以將採集到的信息填充到最後的模板中,爲每個帖子「量身定製」標題。

下面是最終的產出成果:

最後成功以下:

我使用適合紐約市的任何圖片的通用標題,標記了圖片的Instagram賬戶和原始來源,添加了三十個主題標籤來提高帖子的曝光率。若是你繼續查看帖子評論,你甚至還能夠看到原始做者向我表示感謝。

發佈

如今我有一個集中管理的圖片資源庫,並可使得每一個帖子自動化生成標題,僅需最後的臨門一腳——發佈。

我在AWS上啓動了一個EC2實例來託管個人代碼,之因此選擇這種方式是由於它比個人我的計算機更可靠——它始終保持聯網狀態,並且項目的工做量徹底包含在AWS免費服務的條件限制之下。

我編寫了一個Python腳本隨機抓取其中一張圖片,並在完成抓取和清理過程後自動生成標題。我設置了一個定時任務:天天早上8點,下午2點和晚上7:30調取個人API,完成全部的發佈操做。

此時,我已經徹底自動化了內容查找和發佈過程,我再也不須要天天都找資源和發帖子運營個人帳號了——程序爲我完成了全部事情。

漲粉

僅僅發佈是不夠的——我須要制定一些方法持續漲粉。因爲我不會手動執行任何操做,所以這一步驟我也須要想辦法自動化處理。個人想法是經過直接與受衆的興趣用戶直接互動以增長帳號的曝光率。

我寫的交互腳本從美國東部時間上午10點到下午7點運行,在我看來這段時間是Instagram最活躍的時間範圍。在這一天中,個人賬戶有條不紊地關注,取關,併爲相關的用戶和照片點贊,以使他們以一樣的方式與我互動。

關注(更加數據科學的方式)

若是你是Instagram用戶,無論你是否意識獲得,我敢確定都被「卷」過這種增粉方法,尤爲對於試圖增長粉絲的用戶來講很是有用。某天若是你在健身版塊中關注一個有趣的Instagram頁面,次日你就會被一羣健美運動員和健身模特所關注。儘管這種方法看起來很是微不足道,但它確實很是有效。

須要注意的是你不能在Instagram上濫用這個方法關注其餘帳號。Instagram的算法有很是嚴格的限定,若是你在一天內操做過多或關注太多用戶,他們會將你中止你的操做甚至封掉你的賬號。

此外,你一天在Instagram上最多隻能夠被7500人關注;並且通過大量的測試,我發現你能夠在一天內關注400人,取關400人。畢竟操做條件有限,每一次關注都很是寶貴,不能浪費在不太可能和你互粉的人身上。因而,我決定採集每次操做的元數據,基於此創建一個模型來預測某我的與你互粉的可能性,確保個人每個關注操做都是有意義的。

我花了幾分鐘手動收集了20多個與我處在版塊下的賬號。我沒有初始數據,所以前幾周我爲增長個人關注量隨機執行這些操做,但更重要的是我須要採集儘量多的元數據,以便我能夠創建個人預測模型。

我瀏覽了20多個相關賬戶,關注了他們的粉絲,贊他們的照片或評論他們的帖子。在每次關注操做中,我都儘量多地獲取用戶的元數據造成一個CSV文件,包含他們的關注者和粉絲的比例,他們是公開帳號或私人帳號,或者他們是否有我的資料圖片等。

天天,腳本都會自動掃描CSV文件並標記他們的反應,經過0,1,2進行順序評級。若是兩天內用戶沒有任何迴應則標註爲0,若是用戶回粉但沒有在最近的十張圖片中發生任何互動行爲則標註爲1,2則是最理想的結果,表示他們回粉並在最近十個帖子中進行了互動。這樣下來,個人數據集看起來即是這個樣子的:

在將數據「喂」進ML模型前,我經過探索性數據分析得出如下結論:

雖然點贊黨和評論黨較關注黨回粉個人可能性小,但他們更喜歡與我互動。這說明儘管他們沒法直觀地帶來關注量的增長,但他們能夠提高我帳號的質量。

早上關注用戶比晚上關注用戶的回粉效果好。

公開的帳號較私密帳號更願與我互粉。

女性較男性更願意回粉個人帳號。

關注用戶數大於粉絲數的用戶(關注與粉絲的比例大於1.0)更願意與我互粉。

從上面的洞察,我優化了最初對搜索用戶的方式。我調整了個人設置,只在早上去關注,主要尋找女性用戶。如今,我終於可以創建一個機器學習模型,在與用戶交互以前,根據用戶的元數據預測是否會關注我,這樣就不會浪費我天天可以關注的用戶額度,去關注一個不會跟我互粉的人。

接下來,我選擇使用隨機森林算法對後續的結果進行分類。最初,我並無設置結構或結果變量,而是使用了許多不一樣的決策樹,由於我想獲得它們的可視流程圖。隨機森林是決策樹的加強,糾正單個樹中存在的不一致性。在對個人訓練數據進行建模後,測試數據上的精度一直超過80%,因此這對我來講是一個很是有效的模型。進一步,將模型應用於抓取的用戶的代碼,優化了關注算法,個人關注人數開始蹭蹭的往上漲。

取關

兩天後,我就不會再繼續關注我以前關注的人,兩天已經足夠讓我肯定他們是否會回粉。這樣我能關注更多的人、收集更多的數據,並持續漲粉。

爲何我要對他們取關呢?有兩個緣由:第一,個人關注人數的額度上限爲7500人;第二,每一個人確定都但願提升被關注/關注的比率,這樣才能體現本身特別受歡迎,特別吸引人。

這是一項簡單的任務,由於你不須要作出任何決定。你某一天關注了400我的,兩天後你把這些人取關就好了。

點贊

點贊也能夠提升關注人數。可是我沒有投入太多的精力去選擇一些你們都喜歡而且會去點讚的圖片貼在個人帳戶中,由於對比以上其餘方法,這個效果並不那麼明顯。因此,我只是提供了一組預約義的主題標籤,經過主題關聯,用戶的連鎖點擊,收穫一些關注者。

自動推銷

至此,我有一個特別智能的Instagram機器人。個人NYC主頁會尋找與它相關的內容,淘汰不良的潛在帖子,吸引用戶羣,並全天發帖。此外,從上午7:00 到下午 10:00,它經過分析點贊、關注和不關注的受衆人羣來修改自身的設置,而且經過一些算法來優化受衆人羣的定義。最棒的是,它的分析與操做更加人性化,與Instagram真實用戶類似。

有一兩個月,我能明顯看到關注人數的增加。天天個人帳戶中都會多100到500名的新關注者,一塊兒欣賞我所愛的城市的美麗圖像。

我能夠開始享受個人生活,認真的工做,和朋友出去吃飯、看電影,並不須要花費時間去手動發帖。當我忙於本身的事時,它能徹底託管個人帳戶。

當我擁有了20000個追隨者的時候,我決定是時候靠它來蹭吃蹭喝了,因此我須要它自動推銷個人產品。

我作了一個通用的消息模板,不管是餐館、劇院、博物館仍是商店,這個模板都能適用。下面就是我絞盡腦汁想出來了的:

如今,我只須要記錄帳戶名稱和消息發送時個人關注者數量。

個人目標是找到商業用戶並像他們推銷個人產品。商業用戶資料與普通用戶資料略有不一樣—商業用戶能夠在其網頁上添加電子郵件、電話號碼、地址等其餘詳細資料。但最重要的是,他們的資料中都有一個類別標籤。

上面那張圖中是一個商業用戶的示例。在左上角的名稱下方,顯示出它是一個韓國餐廳,同時頂部設有電話呼入、電子郵件和地址等提示信息。

我寫了一個Python腳原本查找這類頁面而且讓個人賬戶可以自動向它們發送消息。該腳本採用兩個參數,一個初始主題標籤和一個要在類別標籤中查找的字符串。這裏,我使用標籤「Manhattan」和字符串「restaurant」來舉例說明。

這個腳本的做用是去提取主題標籤並加載照片,而後遍歷這些帖子,直到找到在照片中標記用戶的帖子。若是找了到,它會檢查其標籤,確認它是不是商業用戶。

若是是,就查看該用戶類別。若是類別包含「餐館」一詞,則會向他們發送個人信息。商業用戶通常都會在他們的頁面上留下他們的電子郵件,因此能夠向他們自動發送電子郵件,在後臺跟進個人Instagram消息便可。在搜索過程當中,我能夠隨時將標籤更改成#TimesSquare,也能夠將目標字符串更改成「博物館」等,我想搜索什麼都行。

當我登陸進入帳戶後,我會看到它自動生成和發送的消息。

若是我去個人Gmail發件箱, 我就會看到如下郵件:

我還有一個腳本, 用來監測個人收件箱中的任何回覆,同時提醒我。若是我收到回覆郵件,我就會聯繫個人潛在客戶。

以上這些操做,都是腳本自動運行的, 並不須要任何人工操做。

我終於實現了蹭吃蹭喝~

最終效果比我以前想象的還要好,我利用Instagram推廣換取了不少餐廳的禮品卡以及免費餐。

藉助人工智能、自動化腳本和數據科學的力量,在代碼腳本自動運轉時,我能夠高枕無憂。它是一個特別盡責的推銷員,讓我可以有本身的時間享受生活。

相關文章
相關標籤/搜索