寫給產(chǎn)品/市場/運營狗的黑科技教程:如何用數(shù)據(jù)抓取調(diào)研競品、獲取用戶?


          Warning: Invalid argument supplied for foreach() in /data/cxweb/www/gupowang.com/public/article/view.html on line 71
          7年前

           

          570d163.jpg

          來源|知乎 

          作者|范冰XDash


          互聯(lián)網(wǎng)是一座資源未被充分結(jié)構(gòu)化的數(shù)據(jù)倉庫,利用技術(shù)手段批量從已知網(wǎng)頁或其他數(shù)據(jù)源下載資源的方法,就是數(shù)據(jù)抓取。執(zhí)行這項任務(wù)的程序被稱為網(wǎng)絡(luò)爬蟲(Web crawler),它的職責在于采集、處理和儲存。


          早期的數(shù)據(jù)抓取是一種按照特定規(guī)則,自動批量獲取互聯(lián)網(wǎng)信息的程序或腳本,能夠輔助搜索引擎建立對海量內(nèi)容的索引。不過,如同光明同黑暗同時誕生,數(shù)據(jù)抓取技術(shù)的出現(xiàn),也帶來惡意爬蟲的降生,無論是制造虛假注冊用戶數(shù)據(jù)、采集競爭對手情報、嘗試破解用戶口令還是自動下單刷量,都離不開爬蟲。對此我們不多做探討。


          總部位于加州的 Diffbot 公司成立于 2008 年,創(chuàng)始人兼首席執(zhí)行官 Mike Tung 是斯坦福畢業(yè)的研究生。這家公司的業(yè)務(wù)模式就是通過人工智能技術(shù),讓機器識別網(wǎng)頁,抓取關(guān)鍵內(nèi)容,再對其進行結(jié)構(gòu)化處理,繼而輸出軟件乃至人眼可以直接識別的結(jié)果。Diffbot 的技術(shù)被廣泛應(yīng)用于知識圖譜、商業(yè)智能等領(lǐng)域。Scikit-Learn 機器學習庫、phantomjs 渲染引擎等在其中扮演關(guān)鍵角色。


          我的一位好友在國內(nèi)知名外企出任技術(shù)專家,業(yè)余兼職為各種項目提供數(shù)據(jù)抓取服務(wù)。他親身參與實踐的案例包括:


          • 鎖定早期用戶:西安一家新開業(yè)的美術(shù)教育機構(gòu)招生,他花了兩天時間寫爬蟲,抓取了國內(nèi)最大的美術(shù)生交流社區(qū)上的公開學生信息,包括姓名、專業(yè)、電話、地理位置,篩選后將西安周邊地區(qū)的學生名單賣給了這家機構(gòu)。

          • 調(diào)研競爭對手:為一家垂直電商的后起之秀服務(wù),把兩個成熟競品過往兩年的訂單量、交易量及交易人數(shù)抓取整理出來,估算了對方的流水,由此為團隊擴增、制定指標和新一輪融資提供了直觀參照。

          • 立項市場調(diào)查:他的一位好友打算做面向年輕人的動漫項目,想從非一線城市做起,于是請他把某國內(nèi)最大“二次元”駐扎視頻網(wǎng)站的用戶數(shù)據(jù)抓取了三天,最后得出結(jié)論:成都、南京、杭州等城市是適宜啟動的絕佳地點。

          • 年底業(yè)績交差:某國企在焦躁的互聯(lián)網(wǎng)轉(zhuǎn)型中指定了高不可攀的業(yè)績指標,分公司負責人請他編寫爬蟲模擬新用戶到網(wǎng)站注冊,成功沖抵差額,在年底考核中保住了位子。


          一、如何編寫爬蟲腳本抓取數(shù)據(jù)?基本步驟策略如下:


          1. 選定目標。首先確定被抓取方提供了哪些服務(wù),比如網(wǎng)站、移動應(yīng)用、開放平臺等。如果所有服務(wù)是等價的,不存在某一服務(wù)缺失什么功能,就優(yōu)先從移動應(yīng)用開始抓取。因為應(yīng)用一般是通過 API 來獲取數(shù)據(jù),透過 API 抓取的數(shù)據(jù)比較方便后期的結(jié)構(gòu)化整理。

          2. 技術(shù)方案。實際抓取采用的技術(shù)手段視情況而定,如果需求簡單且對方完全沒有防護,可以用命令行腳本;稍微復雜一點可以使用 Python,requests、beautifulsoup、re 都是實用的第三方庫。

          3. 性能優(yōu)化。如果是單次抓取需求,并不需要持續(xù)穩(wěn)定地一直跟蹤抓取,則對性能優(yōu)化的考慮較少,可以直接在本機或是虛擬主機上執(zhí)行,通過多個不同進程來同時工作,以調(diào)度器來統(tǒng)一管理。復雜一些可以考慮用付費的第三方云服務(wù)。

          4. 資源結(jié)構(gòu)。抓取網(wǎng)頁,一般先研究頁面上是否有統(tǒng)一的資源 ID 命名方式(分類、排行、導航、搜索通常能提供良好的組織結(jié)構(gòu)和命名規(guī)則),然后遞增、遍歷或借助能批量處理特定結(jié)構(gòu)的第三方庫。

          5. 見招拆招。對于采取防抓取措施的對象,也有應(yīng)對方法:如果對方要求注冊,網(wǎng)頁服務(wù)可以在 request 請求中把瀏覽器的 cookie 帶上,移動應(yīng)用抓包看看 Auth Key 然后在請求中帶上;如果對方有IP限制,可以用代理池解決;如果有隨機數(shù)時間校驗,就用 random 命令生成一個對應(yīng)長度的隨機數(shù)來延時。

          6. 數(shù)據(jù)處理。臟數(shù)據(jù)要用正則表達式或者 beautifulsoup 這樣的第三方包把想要的內(nèi)容取出來,然后存放到數(shù)據(jù)庫,或是以約定的分隔符來劃分字段并保存到文本文件里。

          7. 數(shù)據(jù)分析。簡單的分析可以用命令行里的 sort、uniq、awk、diff 等搞定,復雜需求借助第三方庫 pandas 可以方便地完成各種維度的分析查詢和統(tǒng)計工作。


          二、數(shù)據(jù)抓取的基礎(chǔ)指令和常用工具:


          寫個爬蟲抓取網(wǎng)絡(luò)資源并不是每次都要興師動眾。掌握基本的指令,你也可以在十分鐘之內(nèi)拿到想要的內(nèi)容。


          1、CURL


          Curl 是命令行下的開源文件傳輸工具,如果你使用蘋果電腦或者 Unix、Linux 發(fā)行版,系統(tǒng)會自帶,Windows 用戶也可以安裝對應(yīng)的移植版本。

          Curl 命令的基本使用方法是,在命令行下執(zhí)行:


          curl https://assets-cdn.github.com/favicon.ico


          其中 https://assets-cdn.github.com/favicon.ico 是想抓取到本地的資源文件 URL。另外你也可以在 curl 后面添加以下參數(shù)或語法,實現(xiàn)更多高級配置:


          • -o:將抓取到的資源按照指定名稱保存,實現(xiàn)數(shù)據(jù)初步整理

          • -C:斷點續(xù)傳,適合抓取大塊頭文件或是網(wǎng)絡(luò)環(huán)境不穩(wěn)定時

          • -u:配合輸入用戶名和密碼,可獲得加密資源的授權(quán)訪問資格

          • -x:指定代理主機和端口,配合代理池可以在抓取時“打一槍換一個地方”

          • -d:在發(fā)起請求時傳送參數(shù),運用巧妙既可以簡化腳本代碼,也可以實現(xiàn)更多出彩特性

          • 中括號:在 URL 中使用形如“[100-200]”語法,可以順次從 100、101、102…200 之間的等間距資源,比如按順序保存的文件名。


          我在《增長黑客》“獲取用戶”章節(jié)中談到如何抓取第三方唱歌應(yīng)用里的用戶頭像,稍加整理后用于某移動交友產(chǎn)品內(nèi)測期間的數(shù)據(jù)冷啟動,使用的就是這個 curl 指令。我們僅花費 2 個小時就拿到了 10000 多張高質(zhì)量的頭像大圖,人工消耗成本極低。


          Curl 命令的詳盡使用教程,可以參閱《黑客與畫家》譯者阮一峰先生整理的這篇指南:http://www.ruanyifeng.com/blog/2011/09/curl.html


          2、file_get_contents


          PHP 下的 file_get_contents() 函數(shù)用于將整個文件讀入一個字符串中,既適用于本地文件,也作用于網(wǎng)絡(luò)資源。早年網(wǎng)絡(luò)上流行的第三方開源 CMS(Content Management System,內(nèi)容管理系統(tǒng))就有不少以自動抓取作為賣點,核心就是圍繞這個函數(shù)展開。


          我也經(jīng)常建議我的客戶,在不傷及被抓取對象利益的前提下,盡可能編寫腳本完成每日的常規(guī)運營工作,比如本地新聞、天氣預報、行業(yè)動態(tài)——這項工作如果只是向外界傳遞“我們還沒有倒閉”的信息,那就不要占用額外人力,畢竟網(wǎng)上可供抓取的更新來源太多。


          file_get_contents 可以配合的其他常用函數(shù)包括:


          • explode():根據(jù)指定分隔符(比如逗號、分好、頓號),將抓取到的網(wǎng)頁源代碼切割成數(shù)組。比如網(wǎng)頁上的新聞列表(通常用“<li>”“<ol>”等標簽作為分隔符),就能用這個命令分塊提煉出各自標題。

          • strpos():可以在抓取到的網(wǎng)頁源代碼里查找特定的字符。例如在輿情采集分析過程中,如果發(fā)現(xiàn)被抓取頁面出現(xiàn)了競爭對手的名稱,則產(chǎn)生對應(yīng)的提醒動作,平時相安無事。

          • substr():用于從一串字符中截取出特定位數(shù)的字符,能剔除掉不必要的數(shù)據(jù),讓抓取結(jié)果干凈和便于處理。

          • echo():打印出抓取結(jié)果看看,分析意外最直觀的方式。


          我成功將 file_get_contents() 函數(shù)用于多個商業(yè)項目中,包括為某世界五百強公司在國內(nèi)的微信公眾平臺菜單里實現(xiàn)與美國官網(wǎng)同步更新。此外業(yè)余也開發(fā)過有意思的用途,例如曾抓取多玩網(wǎng)數(shù)據(jù)開發(fā)了微信里的爐石傳說卡牌游戲查詢器,以及在Mac平臺的效率軟件Alfred里自行開發(fā)股票查詢、日語字典、資訊快遞等插件。


          PHP 官方網(wǎng)站上提供了這個函數(shù)的使用文檔:http://php.net/manual/zh/function.file-get-contents.php


          3、Charles——抓包利器


          有時候我們無法直接從程序界面抓取到文字或圖像資源(對方可能封鎖了網(wǎng)頁點擊,或者想抓取對象來自移動應(yīng)用)。這時候可以改換思路,不抓靜態(tài)資源,而是抓包。你可以將“抓包”理解成數(shù)據(jù)在運載過程中即被截獲,有點像“劫鏢”。

          Charles 是基于 Java 的跨平臺工具,可用于 Windows、Mac 和 Linux 平臺,能夠讓開發(fā)者方便地查看聯(lián)網(wǎng)設(shè)備(電腦、手機、平板電腦)在傳輸交互中產(chǎn)生的數(shù)據(jù)包。只要手機和電腦在同一無線網(wǎng)絡(luò)內(nèi),就能夠在電腦上查看手機端收發(fā)的數(shù)據(jù),既包括最終可見的界面文字,也包括隱含傳輸?shù)奈募^、指令、參數(shù)等。


          3.png

          Charles 的官網(wǎng)是:https://www.charlesproxy.com/


          三、如何規(guī)避抓取別家數(shù)據(jù)的潛在風險?


          除了上述披露細節(jié),在我的《增長黑客》里也提到一些數(shù)據(jù)抓取解決冷啟動的實戰(zhàn)案例。其實在互聯(lián)網(wǎng)行業(yè)里,依靠抓取來獲取數(shù)據(jù)的做法,并不罕見(如果你覺得很新鮮,那只能說道行太淺)。既然我敢于公眾與眾,就不可避免遭遇質(zhì)疑和非議。


          在此請允許我就“如何規(guī)避抓取別家數(shù)據(jù)的潛在風險?”的問題闡述我的經(jīng)驗和反思:


          第一,技術(shù)是中立的,本身不帶有任何傾向性。


          如何你覺得從別的平臺“右鍵另存為”來獲得資源并運用到自己的產(chǎn)品里不構(gòu)成任何問題,那么寫腳本批量抓取沒有改變這件事的性質(zhì),它只是幫你將原本需要人工操作三天的事情簡化到三個小時內(nèi)自動完成。


          第二,平臺各有自己的政策,不同平臺的抓取策略不同。


          有的平臺明確在自己的用戶協(xié)議里聲明,“本平臺只承擔數(shù)據(jù)存儲的作用,內(nèi)容版權(quán)隸屬原作者所有”,這時候,你完全可以征得原作者同意之后,以你認為方便的途徑去獲取。至于如何快速大量獲得原作者同意?也可以通過寫腳本批量發(fā)私信給目標人群。這種行為的性質(zhì)參見第一條。


          第三,分清學習目的與商用目的。


          我專門查詢過版權(quán)法等相關(guān)法律法規(guī),其中對“出于學習目的”是有專門的分類討論的。如果將抓取來的數(shù)據(jù)用于產(chǎn)品上線前內(nèi)部的測試、參考,以此作為私下決策依據(jù)而非投入實際商業(yè)運作, 我認為是屬于這一范疇的(當然還是得具體問題具體分析)。當然,你最好還是先征詢你律師的建議。


          最后,你有沒有越界,其實你自己心里清楚。


          四、如何反抓取,保護自己的數(shù)據(jù)資產(chǎn)?


          既然有抓取,自然也有反抓取。通常反抓取的目的在于:


          第一,保護企業(yè)的數(shù)據(jù)資產(chǎn)。雖然通常能被抓取的是公開內(nèi)容,但這些可免費查詢的資源很可能原本就是一種商業(yè)競爭策略,如果被對手抓取,競爭力此消彼長,很可能讓讓企業(yè)蒙受損失,這是需要防范的。


          第二,節(jié)省帶寬,提升服務(wù)性能。初級程序員編寫的腳本如果性能堪憂,源源不斷的訪問會對被抓取網(wǎng)站的帶寬和性能帶來壓力,抬升成本。有些抓取初衷雖無惡意,卻叫人哭笑不得。我在攜程的一個朋友就曾抱怨,每年三月都會迎來一波被抓取的高峰期,原來是計算機專業(yè)應(yīng)屆畢業(yè)生此刻都在忙著畢業(yè)答辯,抓取數(shù)據(jù)趕論文。


          第三,去除數(shù)據(jù)噪音。數(shù)據(jù)抓取會影響對網(wǎng)站流量指標的誤判,徒增的 IP/PV/UV 可能源自機器爬蟲的訪問,這對于運營人員拆分流量和追蹤用戶形成了干擾,與其在分析數(shù)據(jù)階段清洗數(shù)據(jù),不如在收集數(shù)據(jù)階段就屏蔽干擾因素。


          常見的反抓取策略包括:封鎖 IP、封鎖設(shè)備、限制單位時間內(nèi)的訪問頻度、混淆代碼增大識別難度等。將單一策略組合起來,能更有效地避免誤判,以免將普通用戶識別為爬蟲。


          當然還有以其人之道還治其人之身的玩法。我的一個朋友就曾因自己辛勤維護的電子書網(wǎng)站被對手多番抓取而大為慍怒,交涉無果的他,最后祭出一招“投毒策略”——在檢測到被爬蟲抓取時,向?qū)Ψ教峁┦孪葴蕚浜玫奶摷贁?shù)據(jù)。結(jié)果是,那位可憐的對手網(wǎng)站上出現(xiàn)了敏感信息,被網(wǎng)監(jiān)請去喝了回茶。


          【相關(guān)閱讀】

          從用戶需求出發(fā):云音樂Vs蝦米音樂VsQQ音樂競品分析 

          細數(shù)App推廣要做哪些事!懂渠道,做方案,有人脈,分析競品…

          2016年后搞互聯(lián)網(wǎng)創(chuàng)業(yè),如何低成本獲取用戶?

          APP運營初期該如何面對種子用戶

          未來,用戶究竟是誰的奶酪?


          姑婆那些事兒推廣服務(wù) 點擊 :http://www.3377on.com/news/4585.html

          大家都愛搜:ASM 互聯(lián)網(wǎng)資訊類類有話說App推廣運營經(jīng)驗線下推廣活動推薦微信營銷姑婆專題姑婆圈ASO校園推廣地推ASO100渠道刷量校園運營團隊

          姑婆那些事兒(www.3377on.com)是互聯(lián)網(wǎng)推廣運營知識分享平臺,關(guān)注移動推廣(android,ios)運營,網(wǎng)站推廣運營、校園推廣及互聯(lián)網(wǎng)領(lǐng)域最新動態(tài) 。歡迎關(guān)注我們的微信(gupo520),新浪微博(姑婆那些事兒)。

          版權(quán)聲明:本文來源于互聯(lián)網(wǎng),僅作分享學習之用,姑婆那些事兒負責整理推薦。文章僅代表原作者獨立觀點,不代表本平臺運營者觀點與立場。如有版權(quán)問題,請聯(lián)系姑婆那些事兒—小秘書(微信號:gpxms001)協(xié)商解決 

          收藏

          {{favCount}}

          個人收藏

          投稿請戳這里!投稿
          0

          次分享

          文章評論(0)

          {{ user.nickname }}
          發(fā)表評論
          登錄 進行評論
          加載更多 正在加載中... 沒有更多了