豆瓣電影 知識圖譜 Neo4j

轉載自公衆號:python-china

作者想學習知識圖譜,奈何沒有數據,只能自己找。於是選擇了豆瓣電影。網址:

https://movie.douban.com/top250?start=0&filter=

一、分析問題

豆瓣電影Top250主頁面看着信息比較完整,仔細看會發現主演內容不全,查看網頁源代碼

直接爬取主頁面,主演內容會獲取不全。於是想到進入每個電影的詳細頁面進行爬取,打開第一個電影,可以看到如下。

信息比較全,所以決定數據從電影詳細頁爬取。
構建知識圖譜首先選擇所要存儲的字段。經過考慮和大家的興趣,主要探索導演、演員、電影的關係,再加上電影類型。所以確定所要爬取的字段爲

  • 電影名稱

  • 導演

  • 演員

  • 電影類型

本文的操作過程步驟如下:
第一步:從主頁爬取到每個電影詳細頁的地址,進行存儲
第二步:讀取第一步中電影地址列表,依次爬取每個電影的信息,進行存儲
第三步:對爬取的電影數據提取整合出知識圖譜的結點和關係
結點:

  • 電影結點(電影ID,電影名稱,標籤)

  • 導演結點(導演ID,導演名稱,標籤)

  • 演員結點(演員ID,演員名稱,標籤)

  • 類型結點(類型ID,類型名稱,標籤)

關係:

  • 導演——電影關係(導演)

  • 演員——電影關係(出演)

  • 導演——演員關係(合作)

  • 電影——類型關係(屬於)

第四步:將結點和關係導入Neo4j,生成圖譜

二、爬取數據

一開始用的Scrapy框架爬取,獲取電影URL比較簡單,獲取到的URL爲下面樣式:

下面對電影詳細頁進行爬取。

一開始繼續使用scrapy,弄了半天,發現電影、導演、類型都爬下來了,可是演員怎麼都獲取不到。後來才注意到演員是JS動態生成的,真是浪費感情了。於是使用requests+BeautifulSoup來爬取數據。

代碼如下:

讀取詳細頁URL列表

遍歷URL列表,爬取每個頁面信息,將每個頁面的信息存儲在results列表

將爬取結果導出到CSV文件

導出的文件如下:

三、生成結點和關係

數據有了,下一步就是整理出所需要的可以直接導入到Neo4j的結點和關係文件。
結點:

  • 電影結點(電影ID,電影名稱,標籤)

  • 導演結點(導演ID,導演名稱,標籤)

  • 演員結點(演員ID,演員名稱,標籤)

  • 類型結點(類型ID,類型名稱,標籤)

提取結點的主要代碼如下:

下面主要獲得電影、導演、演員、類型的集合,方便ID編碼

下面生成電影、導演、演員、類型的ID

拼接結點數據

生成結點文件

關係:

  • 導演——電影關係(導演)

  • 演員——電影關係(出演)

  • 導演——演員關係(合作)

  • 電影——類型關係(屬於)

讀取以上生成的結點文件

遍歷文件,拼接出關係表,主要代碼如下:

導出到CSV

這樣所需要的結點和關係文件就生成好了

director.csv文件格式如下:

relationship_director_film.csv文件格式如下:

四、導入Neo4j,生成圖譜

使用如下語句導入

需要注意的是,這種導入方式需要保證你的數據庫中沒有movie.db,否則會報錯。因爲Neo4j默認的數據庫爲graph.db,所以導入成功後,需要修改neo4j.conf文件,才能查看剛纔生成的數據庫。修改如下:

重新啓動Neo4j後,你就會看到你的數據了。
我們來查看一下效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章