![]()
全球兩大應(yīng)用商店每天產(chǎn)生超過(guò)500萬(wàn)條用戶(hù)評(píng)論。這些文本里埋著產(chǎn)品迭代的密碼——但官方從不提供批量下載入口。
一位獨(dú)立開(kāi)發(fā)者最近開(kāi)源了一套Python方案,能同時(shí)穿透Google Play和App Store的抓取限制。他的代碼在GitHub上被fork了3400次,評(píng)論區(qū)最熱的提問(wèn)是:"這真的不違法嗎?"
Google Play:官方庫(kù)的"合法后門(mén)"
Google其實(shí)留了一個(gè)口子。google-play-scraper這個(gè)非官方庫(kù)調(diào)用的是Play商店內(nèi)部的protobuf接口,本質(zhì)上和你在手機(jī)上滑動(dòng)評(píng)論時(shí)走的是同一條路。
代碼邏輯很直白:先拉200條,拿continuation_token(延續(xù)令牌)翻頁(yè),直到湊夠你想要的數(shù)量。但這里有個(gè)坑——單次請(qǐng)求上限200條,且Google對(duì)高頻IP會(huì)降速。
作者的建議是每頁(yè)之間sleep 2秒。"聽(tīng)起來(lái)很蠢,但這是不觸發(fā)驗(yàn)證碼的最低成本方案。"他在文檔里寫(xiě)道。
返回的數(shù)據(jù)結(jié)構(gòu)經(jīng)過(guò)清洗,包含用戶(hù)名、評(píng)分、評(píng)論正文、時(shí)間戳、App版本號(hào),以及一個(gè)國(guó)內(nèi)用戶(hù)很熟悉的字段:thumbs_up(點(diǎn)贊數(shù))。Google Play的社交屬性比App Store重,這條數(shù)據(jù)對(duì)情感加權(quán)很重要。
App Store:RSS接口的"過(guò)期地圖"
蘋(píng)果的做法更復(fù)古。他們沒(méi)有開(kāi)放API,但iTunes RSS接口從2008年活到了現(xiàn)在,像一張沒(méi)人維護(hù)卻還能導(dǎo)航的舊地圖。
抓取邏輯完全不同:按頁(yè)碼輪詢(xún),每頁(yè)最多50條。URL結(jié)構(gòu)長(zhǎng)這樣——
https://itunes.apple.com/us/rss/customerreviews/page=1/id=APP_ID/sortby=mostrecent/json
注意那個(gè)sortby=mostrecent。蘋(píng)果允許按"最有幫助"或"最新"排序,但開(kāi)發(fā)者選了后者。原因是"最有幫助"會(huì)被刷評(píng)黨污染,時(shí)間序反而更接近真實(shí)用戶(hù)聲音。
返回的JSON嵌套很深。im:rating藏在entry對(duì)象里,content標(biāo)簽里的label才是正文,updated字段比at更可靠——這些細(xì)節(jié)沒(méi)文檔,全靠抓包逆向。
一個(gè)有趣的缺失:App Store沒(méi)有點(diǎn)贊數(shù)。蘋(píng)果的評(píng)論系統(tǒng)不做社交排序,thumbs_up字段被硬編碼為0。這對(duì)跨平臺(tái)情感分析是個(gè)噪音,需要后續(xù)清洗時(shí)剔除。
統(tǒng)一管道:兩種方言的同聲傳譯
真正的工作量不在抓取,而在對(duì)齊。兩個(gè)平臺(tái)的字段命名、日期格式、評(píng)分粒度完全不同,作者用了一個(gè)簡(jiǎn)單的映射表做歸一化:
Google Play的at是datetime對(duì)象,要轉(zhuǎn)isoformat;App Store的updated已經(jīng)是字符串,但帶時(shí)區(qū)。版本號(hào)字段一個(gè)叫reviewCreatedVersion,一個(gè)叫im:version。用戶(hù)ID一個(gè)用userName,一個(gè)嵌套在author.name.label里。
最終輸出的統(tǒng)一結(jié)構(gòu)只有7個(gè)字段:source、app_id、author、rating、text、date、version、thumbs_up。足夠喂給大多數(shù)NLP模型,也足夠讓產(chǎn)品經(jīng)理做競(jìng)品監(jiān)控。
作者沒(méi)有寫(xiě)數(shù)據(jù)存儲(chǔ)層。"pandas DataFrame直接to_csv,"他說(shuō),"生產(chǎn)環(huán)境自己接數(shù)據(jù)庫(kù)。"這種克制很產(chǎn)品經(jīng)理——解決核心痛點(diǎn),把邊緣需求踢給用戶(hù)。
法律灰色地帶的"免責(zé)聲明"
代碼倉(cāng)庫(kù)的README用加粗字體標(biāo)了一段話(huà):本工具僅供學(xué)術(shù)研究,請(qǐng)遵守各平臺(tái)服務(wù)條款。但誰(shuí)都知道,服務(wù)條款禁止的正是"自動(dòng)化抓取"。
Google Play的ToS第3.3條明確禁止"使用任何機(jī)器人、爬蟲(chóng)或自動(dòng)化方法訪(fǎng)問(wèn)服務(wù)"。蘋(píng)果的開(kāi)發(fā)者協(xié)議也有類(lèi)似表述。這套代碼的合法性取決于用途和規(guī)模——個(gè)人做 sentiment analysis(情感分析)可能沒(méi)事,商業(yè)競(jìng)品監(jiān)控就是另一回事了。
作者自己似乎也在試探邊界。他在示例代碼里用了com.twitter.android和284882215(Facebook的App ID),但沒(méi)有放真實(shí)抓取結(jié)果。GitHub上的issue列表里有條未關(guān)閉的討論:"有人被封IP嗎?"回復(fù)區(qū)一片沉默。
一個(gè)技術(shù)細(xì)節(jié)可能降低風(fēng)險(xiǎn):兩個(gè)接口都不需要登錄。Google Play的protobuf接口是公開(kāi)的,App Store的RSS接口本來(lái)就是為了第三方聚合器設(shè)計(jì)的。這和破解認(rèn)證機(jī)制有本質(zhì)區(qū)別——你在用瀏覽器能訪(fǎng)問(wèn)的URL,只是用代碼批量訪(fǎng)問(wèn)了。
但"公開(kāi)"不等于"授權(quán)"。2021年hiQ Labs訴LinkedIn案確立了一個(gè)原則:公開(kāi)數(shù)據(jù)可以被抓取,但平臺(tái)仍能用技術(shù)措施阻止。Google和蘋(píng)果完全有能力在下一版更新中封掉這些端點(diǎn)。
產(chǎn)品情報(bào)的"地下管道"
為什么有人愿意冒這個(gè)險(xiǎn)?因?yàn)楣俜教娲桨敢促F,要么慢,要么根本不存在。
Google Play Console只給開(kāi)發(fā)者看自己的評(píng)論,且導(dǎo)出功能有90天限制。App Store Connect更封閉,API需要企業(yè)級(jí)賬號(hào)。第三方數(shù)據(jù)服務(wù)商如Sensor Tower、App Annie(現(xiàn)data.ai)的年費(fèi)動(dòng)輒數(shù)萬(wàn)美元,且粒度不如原始文本。
這套Python方案的成本是:一臺(tái)云服務(wù)器,一個(gè)ScraperAPI密鑰(用于IP輪換),和幾小時(shí)寫(xiě)代碼的時(shí)間。作者估算,抓取10萬(wàn)條評(píng)論的邊際成本低于5美元。
應(yīng)用場(chǎng)景很具體。產(chǎn)品經(jīng)理可以用它監(jiān)控競(jìng)品的版本迭代節(jié)奏——看哪個(gè)版本號(hào)對(duì)應(yīng)的差評(píng)激增。客服團(tuán)隊(duì)可以建自動(dòng)告警,當(dāng)"閃退""卡頓"關(guān)鍵詞密度超過(guò)閾值時(shí)推送飛書(shū)。投資分析師曾用它追蹤C(jī)lubhouse的下載評(píng)論比,在媒體報(bào)道之前預(yù)判了增長(zhǎng)見(jiàn)頂。
一個(gè)未被官方承認(rèn)的事實(shí):很多ASO(應(yīng)用商店優(yōu)化)服務(wù)商的底層數(shù)據(jù)就是這么來(lái)的。他們包裝成"AI驅(qū)動(dòng)的競(jìng)品洞察",售價(jià)翻十倍。
技術(shù)債與反制措施
這套方案有明確的保質(zhì)期。Google已經(jīng)在測(cè)試新的Play商店前端,protobuf接口可能被GraphQL取代。蘋(píng)果的RSS接口多年未更新,但iOS 18的App Store改版可能帶來(lái)變數(shù)。
作者留了擴(kuò)展接口:Google Play部分支持代理輪換,App Store部分建議用 residential proxy(住宅代理)規(guī)避頻率限制。但他沒(méi)有實(shí)現(xiàn)完整的反反爬系統(tǒng)——"那是另一個(gè)項(xiàng)目的價(jià)格。"
更隱蔽的風(fēng)險(xiǎn)是數(shù)據(jù)質(zhì)量。Google Play的評(píng)論可以編輯,用戶(hù)經(jīng)常把1星改成5星,或反之。App Store的RSS接口有延遲,最新評(píng)論可能滯后6-48小時(shí)。這兩個(gè)問(wèn)題沒(méi)有代碼層面的解法,只能在接受數(shù)據(jù)時(shí)做心理備案。
一個(gè)產(chǎn)品經(jīng)理視角的觀察:這套工具的價(jià)值不在技術(shù)難度,而在"知道哪里能鉆"。google-play-scraper庫(kù)已經(jīng)存在5年,iTunes RSS接口活了16年,但把兩者拼成統(tǒng)一管道并開(kāi)源的,這是第一個(gè)。
GitHub倉(cāng)庫(kù)的最后一次提交是3周前。作者回復(fù)了一個(gè)issue:"App Store在日本區(qū)返回空數(shù)組,有人能復(fù)現(xiàn)嗎?"
沒(méi)人回復(fù)。但star數(shù)還在漲。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.