首先交代一下爬蟲所用到的資料庫和環境:
neo4j使用類似sql的查詢語言cypher,關於cypher的使用和簡單demo,可以參考cypher查詢語言–neo4j中的sql。當然,為了減少學習cypher的時間成本,我在python環境中安裝了py2neo,pip install py2neo
。
py2neo的handbook見the py2neo v3 handbook。我對py2neo依賴庫的理解:py2neo是乙個neo4j的客戶端,其中對neo4j的操作進行了封裝。呼叫py2neo的乙個函式,它會自動轉化為cypher語言並以http api向neo4j服務埠提交乙個事務。當然它也支援直接提交cypher語句到neo4j執行,有些複雜的資料操作比如尋找兩點之間最短路徑,py2neo沒有提供直接的函式呼叫,需要我們自己編寫cypher。
requests
requests是乙個非常好用的網路依賴包,api文件見requests: http for humans。文件**的名字「http for humans」,算是程式設計師的一種幽默吧。
beautifulsoup
beautifulsoup依賴庫是乙個非常實用的html解析器,不需要程式設計師再焦頭爛額地寫regex。雖然開發友好了,但解析時有時會出一些不可思議的bug。api文件見beautiful soup 4.2.0 文件。
目的
我爬蟲的目的非常簡單,和開頭的那篇專欄一樣:知乎大v—輪子哥(vczh)需要通過多少人才能認識並關注我?這裡的認識是指單方面的知道,即成為我的follower(不需要為followee,雖然這是肯定的),知道這世界原來還有個知乎使用者「三天三夜」。
開發思路
爬蟲從我自己的知乎出發,讀取我的follower列表,對我的每個follower重複搜尋操作,直到搜尋到的follower list裡有vczh。這個遍歷是bfs的。當然,為了防止在廣度優先搜尋時,層與層之間節點數量擴張過快,我限制只搜尋follower num不超過100的不活躍的小使用者,當然我提前調查了輪子哥也有follow一些這種小使用者。除了為了防止擴張過快導致的儲存空間過大,這樣做也給驗證六度分隔理論提了更為苛刻的條件,畢竟輪子哥通過其他大v能follow到我的概率是遠大於通過小使用者的。
貼上幾個想到的小細節:
beautifulsoup解析器對比
實際使用中,在解析這條鏈結時,lxml解析一直都會出錯,換成html.parser後解析成功。所以html.parser雖然解析速度慢,但容錯性更好一點。
爬蟲程式在爬了23928個使用者才停下來,即找到了輪子哥。這是爬完的部分使用者圖:
部分使用者關係圖
在命令列執行cypher語句:match (a ), (b ), p = allshortestpaths( (a)-[*..200]->(b) ) return p
可以得到輪子哥到我的最短路徑:
最短路徑圖
可以發現:輪子哥到我,中間正好經過了6個人。這條路的生成條件是較為嚴格的。不僅是因為我只選擇的小使用者進行爬取,而且要知道我的follower目前是只有乙個的,輪子哥要連線到我只能通過他。雖然實驗得到的6可能和六度分隔理論恰巧吻合,但鑑於路徑選擇的苛刻條件,六度的6也許並不只是一種猜想。
Neo4j學習(2) Win系統安裝Neo4j
neo4j 是目前最流行的圖形資料庫,支援完整的事務,在屬性圖中,圖是由頂點 vertex 邊 edge 和屬性 property 組成的,頂點和邊都可以設定屬性,頂點也稱作節點,邊也稱作關係,每個節點和關係都可以由乙個或多個屬性。neo4j建立的圖是用頂點和邊構建乙個有向圖,其查詢語言cypher...
Neo4j 安裝GDS 外掛程式
背景 neo4j自帶的cypher語句中的 shortestpath allshortestpaths 返回值內容非常有限,不易處理,在實際生產環境中可用性極低,且若帶where條件查詢時,查詢效率極低 因此,使用neo4j自帶的外掛程式如apoc來進行最短路徑查詢 neo4j有對應的演算法包,al...
Neo4j檔案說明
neo4j作為資料庫式的nosql工具,檔案儲存也有其獨特方面。neostore neostore.id 儲存版本資訊 neostore.nodestore.db neostore.nodestore.db.id 儲存節點資料與節點序列id neostore.propertystore.db neo...