neo4j安裝 基於Neo4j的知乎關係爬蟲

2021-10-11 16:38:38 字數 1929 閱讀 8187

首先交代一下爬蟲所用到的資料庫和環境:

neo4j使用類似sql的查詢語言cypher,關於cypher的使用和簡單demo,可以參考cypher查詢語言–neo4j中的sql。當然,為了減少學習cypher的時間成本,我在python環境中安裝了py2neopip 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...