Web Crawler with Python - 09.怎樣通過(guò)爬蟲找出我和輪子哥、四萬(wàn)姐之間的最短關(guān)系(轉(zhuǎn))

作者: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)折汞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盖腿,隨后出現(xiàn)的幾起案子爽待,更是在濱河造成了極大的恐慌,老刑警劉巖翩腐,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟款,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡茂卦,警方通過(guò)查閱死者的電腦和手機(jī)何什,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)等龙,“玉大人处渣,你說(shuō)我怎么就攤上這事≈肱椋” “怎么了罐栈?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泥畅。 經(jīng)常有香客問(wèn)我荠诬,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任柑贞,我火速辦了婚禮方椎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钧嘶。我一直安慰自己棠众,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布有决。 她就那樣靜靜地躺著摄欲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疮薇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天我注,我揣著相機(jī)與錄音按咒,去河邊找鬼。 笑死但骨,一個(gè)胖子當(dāng)著我的面吹牛励七,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奔缠,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掠抬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了校哎?” 一聲冷哼從身側(cè)響起两波,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闷哆,沒(méi)想到半個(gè)月后腰奋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抱怔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年劣坊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈留。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡局冰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灌危,到底是詐尸還是另有隱情康二,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布乍狐,位于F島的核電站赠摇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藕帜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一烫罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洽故,春花似錦贝攒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荒适,卻和暖如春梨熙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刀诬。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工咽扇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陕壹。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓质欲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親糠馆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘶伟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容