1. 程式人生 > >搭建一個小型的證券知識圖譜

搭建一個小型的證券知識圖譜

本專案主要實現邏輯如下:

  1. 資料獲取
  2. 資料處理
  3. 匯入neo4j

本專案需要用到兩種資料來源:一種是公司董事的資訊,另一種是股票的行業以及概念資訊。
董事資訊通過scrapy進行爬取,具體包含各個上市公司董事會成員姓名、職位、性別、年齡。股票的行業及概念資訊通過Tushare資訊進行獲取。

1.董事資訊獲取

我們通過訪問’http://pycs.greedyai.com/’ 來獲取上市公司的董事資訊,主要獲取董事的姓名、職位、性別、年齡
在這裡插入圖片描述
在這裡插入圖片描述
scrapy部分程式碼如下:

# -*- coding: utf-8 -*-
import scrapy
import re
from bs4 import BeautifulSoup
from securities.spiders.savecsv import save_csv
from securities.items import GetItem


class UserinfoSpider(scrapy.Spider):
    name = 'userinfo'
    allowed_domains = ['pycs.greedyai.com']
    start_urls = ['http://pycs.greedyai.com']

    def parse(self, response):
        body = response.css('body').extract()
        url = re.findall('"\.(.*?html)"', body[0])
        for u in url:
            yield scrapy.Request(url='http://pycs.greedyai.com' + u,callback=self.get_info)

    def get_info(self, response):
        soup = BeautifulSoup(response.text, 'html.parser')

        code = re.findall('\d{6}', soup.head.title.text)[0]
        list = []
        tbody_tag = soup.select('#ml_001 > table > tbody')[0]
        m = 0
        for cd in tbody_tag.children:
            if m % 2 != 0:
                n = 0
                for user_tag in cd.children:
                    if n % 8 == 3:
                        thead_tag = str(user_tag.div.table.thead)
                        name = re.findall('target="_blank">(.*?)</a>', thead_tag)[0]
                        jobs = re.findall('<td class="jobs" style="width: 150px;">(.*?)</td>', thead_tag)[0]
                        intro = re.findall('<td class="intro">(.*?)</td>', thead_tag)[0]
                        sex = re.findall('\u7537|\u5973', intro)[0]
                        age = re.findall('(\d*?)\u5c81', intro)[0]
                        info = GetItem()
                        info['name'] = name
                        info['sex'] = sex
                        info['age'] = age
                        info['code'] = code
                        info['jobs'] = jobs
                        yield info

                    n += 1
                break
            m = 1

抓取完的資訊儲存至executive_prep.csv檔案
在這裡插入圖片描述

2.獲取股票的行業及概念資訊

這部分直接通過Tushare獲取

import tushare as ts
df = ts.get_industry_classified()
df = ts.get_concept_classified()

獲取結果儲存至stock_industry_prep.csv和stock_concept_prep.csv檔案
在這裡插入圖片描述

3.資料處理

前兩步完成了資料的獲取,這裡要將獲取到的資料轉換成neo4j可識別的具體格式。
對於格式的要求,請參考:https://neo4j.com/docs/operations-manual/current/tutorial/import-tool/


程式碼部分只是簡單的csv檔案操作,在此不做過多闡述,處理完的資料,分別儲存不同的csv檔案:“executive.csv”, “stock.csv”, “concept.csv”, “industry.csv”, “executive_stock.csv”, “stock_industry.csv”, “stock_concept.csv”。
在此只挑一個節點和一條關係做簡單演示。
在這裡插入圖片描述
executive節點,儲存董事姓名、性別、年齡、股票程式碼、職位資訊
在這裡插入圖片描述
executive_stock關係,宣告董事與公司的關係為work_in

4.匯入neo4j

將上述所有檔案匯入neo4j

bin/neo4j-admin import --nodes import/executive.csv --nodes import/stock.csv --nodes import/concept.csv --nodes import/industry.csv --relationships import/executive_stock.csv --relationships import/stock_industry.csv --relationships import/stock_concept.csv

在這裡插入圖片描述
能看到我們一共匯入了27889個節點和36742個關係,然後啟動neo4j,就可以看到我們匯入的資料了。
在這裡插入圖片描述
比如我們隨便檢視一支股票相關聯的資訊,比如“東方集團”
在這裡插入圖片描述
或者隨便看一個概念“資產注入”
在這裡插入圖片描述
小型的證券知識圖譜搭建到這裡就結束了,所有原始碼及測試資料已上傳至git,點選這裡可直接檢視,有疑問的同學請在部落格下方留言或提Issuees,謝謝!