作者:xlzd
鏈接:https://zhuanlan.zhihu.com/p/20546546
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)勘伺,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
最近這段時(shí)間事情比較多枷莉,很久沒(méi)有更新博客了娇昙,今天這將是爬蟲入門的最后一篇,新年之后笤妙,我將會(huì)更新一系列Python炫技然并卵的博客冒掌。今天,我將要通過(guò)代碼找出知乎上任意兩個(gè)人之間的最短關(guān)系(六度分隔理論的實(shí)踐~)蹲盘。
首先考慮這個(gè)問(wèn)題的解決方案以及與爬蟲的關(guān)系吧股毫。一個(gè)比較可行的方案是,抓取知乎所有人的關(guān)注列表及被關(guān)注列表召衔,然后通過(guò)一個(gè)有向圖連接起來(lái)铃诬,找兩個(gè)人的最短關(guān)聯(lián)關(guān)系,實(shí)際上就是就圖中兩個(gè)節(jié)點(diǎn)的最短路徑苍凛∪は考慮到我希望得到的是仰望型的關(guān)系圖,即從一個(gè)較有名氣的人的關(guān)注列表出發(fā)醇蝴,能否在他的關(guān)注鏈上游找到自己(舉例:我關(guān)注輪子哥很正常宣肚,但是輪子哥沒(méi)有關(guān)注我,不過(guò)他的關(guān)注鏈上有我悠栓,我希望借此找到這個(gè)鏈上的所有人)霉涨。所以,這個(gè)問(wèn)題還可以得到進(jìn)一步的簡(jiǎn)化:只是抓取每個(gè)人的關(guān)注列表而忽略粉絲列表惭适,存儲(chǔ)下這個(gè)人(Node)及與關(guān)注列表每個(gè)人的對(duì)應(yīng)關(guān)系(Relationship)笙瑟。
那么,對(duì)應(yīng)的實(shí)現(xiàn)應(yīng)該如何解決呢癞志?首先要知道知乎的用戶很大往枷,即使剛才的方案干掉了所以沒(méi)有任何人關(guān)注的用戶,但是有至少一個(gè)人關(guān)注的用戶依舊很多,所以不建議自己維護(hù)這樣一個(gè)很大的圖错洁,Graph Database是一個(gè)不錯(cuò)的選擇茅信,這篇博客中,我將使用neo4j來(lái)存儲(chǔ)節(jié)點(diǎn)及其關(guān)系墓臭。而對(duì)應(yīng)的用戶及抓取列表,將使用Mongo存儲(chǔ)妖谴。
既然找到了解決方案窿锉,那么上手開始吧。關(guān)于neo4j的安裝及基本使用膝舅,以及cypher(neo4j使用的操作語(yǔ)法)的入門介紹嗡载,這里將一筆略過(guò),如果你沒(méi)有neo4j的使用經(jīng)驗(yàn)仍稀,請(qǐng)讀者自行去neo4j的官網(wǎng)閱讀學(xué)習(xí)洼滚。
現(xiàn)在,我們將任務(wù)進(jìn)一步細(xì)化:
1. 從知乎的某個(gè)用戶x開始技潘,得到他的關(guān)注列表
2. 將x與其關(guān)注列表中的每個(gè)人each建立關(guān)系: x-FOLLOWING(關(guān)系)->each
3. 將關(guān)注列表還沒(méi)有抓取關(guān)注列表的用戶放入Mongo中
4. 如果Mongo中還有未抓取關(guān)注列表的人遥巴,重復(fù)1
然后,對(duì)于需要查詢某兩個(gè)人之間的最短路徑享幽,只需要在neo4j的web終端里使用對(duì)應(yīng)的cypher語(yǔ)句即可铲掐。當(dāng)然,后續(xù)我將會(huì)實(shí)現(xiàn)一個(gè)網(wǎng)頁(yè)形式的界面以供使用(py2neo+d3.js)值桩。
分析部分至此結(jié)束摆霉,這里并不打算一步一步寫出代碼,不過(guò)會(huì)在最后提供源碼鏈接以供參考奔坟。具體的代碼部分携栋,需要自己完成的是,分析知乎獲取關(guān)注列表的API及其參數(shù)咳秉,然后按照上面分析的步驟一步一步編寫代碼即可婉支。值得注意的是,知乎上每個(gè)人的昵稱滴某、個(gè)性域名都是可變的磅摹,所以不可作為區(qū)分不同用戶的唯一索引,知乎對(duì)應(yīng)每個(gè)人都有一個(gè)user_hash字段霎奢,這才是標(biāo)識(shí)每個(gè)人的真正ID户誓。
最后,在這里貼兩張圖片吧幕侠,分別對(duì)應(yīng)著輪子哥的關(guān)注鏈上我的位置和四萬(wàn)姐的關(guān)注列表上我的位置:
由圖容易看出帝美,輪子哥與我只間隔了一個(gè)人,而四萬(wàn)姐與我之間間隔了最少兩個(gè)人晤硕。
小節(jié)
這篇博客我們接觸了一種新的數(shù)據(jù)庫(kù)——Graph Database悼潭,這里使用的是neo4j作為實(shí)際使用庇忌,不過(guò)希望你可以舉一反三。希望你可以在自己獨(dú)立完成舰褪,在遇到問(wèn)題自己獨(dú)立解決或者盡可能獨(dú)立搞定皆疹,然后再參考后面的源碼。下載源碼請(qǐng)點(diǎn)擊這里占拍。
總結(jié)
關(guān)于爬蟲入門部分的博客就寫到這里了略就,但是寫爬蟲到這一步,你僅僅可以抓取那些不怎么防你晃酒、頁(yè)面不算復(fù)雜的網(wǎng)站表牢,后面還有很多需要自己自學(xué)的知識(shí)。博客中貼代碼的部分由多變少贝次,而整理思路崔兴,思考如何做的部分的比重在逐步增加,因?yàn)槲矣X(jué)得思路更加重要蛔翅,清晰的思路可以幫助你在遇到一個(gè)嶄新的問(wèn)題時(shí)有足夠的想法去解決它敲茄。希望你可以從中得到一些幫助,也希望你在后續(xù)過(guò)程中持之以恒搁宾,不斷前進(jìn)折汞。