每日最新頭條.有趣資訊

怎樣利用Python和自動化腳本在紐約吃霸王餐?

大數據文摘出品

編譯:李雷、睡不著的iris、劉思佳、林安安、蔣寶尚

在家做飯不下館子可以減少開支已經是公開的秘密。但作為一名美食天堂的國民,不下館子幾乎是不可能的。

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

如果你即不想讓錢包當成受害者,又不想放棄美妙的用餐體驗,就得自己“造”錢來支付飯費。

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

本文作者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推廣換取了很多餐廳的禮品卡以及免費餐。

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

最後,如果你也有利用編程和自動化腳本做了相關項目的經驗,比如在北京吃上了霸王餐,歡迎投稿給我們~

相關報導:

https://medium.com/@chrisbuetti/how-i-eat-for-free-in-nyc-using-python-automation-artificial-intelligence-and-instagram-a5ed8a1e2a10

志願者介紹

獲得更多的PTT最新消息
按讚加入粉絲團