图谱可视化手把手教你采集明星人物关系并进行图谱展示

这是我参与8月更文挑战的第11天,活动详情查看: 8月更文挑战

大家好,我是辰哥~

今天教大家获取采集(某度百科)的明星人物关系数据,并进行图谱可视化展示。

亮点(难点):

1.动态查询(输入任意明星名字就可以查询该明星关系人物)。

2.图谱展示(以及key-value形式)

具体介绍就不多讲了,先上效果:

演示视频

可视化实战教学|教你用30行python代码查询明星关系

可以在链接里面输入对应的明星名称就可以获取对应的人物关系图谱(还支持拖拽),比如:李易峰

Image

1. 采集数据

在百度里面搜索:李易峰

Image

可以在明星这栏里面看到明星关系

下面开始定位网页标签

Image

可以看到数据是在id为slider_relations下,对应的ul下的li标签

relations = selector.xpath('//*[@id="slider_relations"]/ul/li')
复制代码

获取到li标签之后,需要解析key-value,key对应关系(搭档、好友等),value对应明星名字


for i in relations:
    re = i.xpath('.//div[@class="name"]/text()')[0]
    name = i.xpath('.//div[@class="name"]/em/text()')[0]
复制代码

Image

2. 网页制作

为了将图谱结合以及可以动态查询任意明星人物关系,这里写成**网站(网页)**形式

通过Flask框架去编写后台,html作为前端,由于前端代码较多这里就不展示了(后面会提供源码)。

首先将采集明星人物关系的代码封装成函数。


###获取信息
def getlist(name_i):
    url_name = "https://baike.baidu.com/search/word?word="+str(name_i)
    s = requests.Session()
    response = s.get(url_name, headers=headers)
    text = response.text
    #此处是解析代码
    
    links = []
    for i in relations:
        re = i.xpath('.//div[@class="name"]/text()')[0]
        name = i.xpath('.//div[@class="name"]/em/text()')[0]
        print(re + "-" + name)
        dict = {'source': str(name_i), 'target': str(name), 'rela': str(re), 'type': 'resolved'}
        links.append(dict)
    return links

复制代码

其中的name_i就是搜索的明星名字,封装好的函数名称是getlist,函数返回的数据为links 

接着是Flask的路由(浏览器里面的网站访问名getdata)


#获取数据
@app.route('/getdata')
def getdata():
    name_i = request.args.get('name')
    # 采集数据
    links = getlist(name_i)
    print(links)
    #return Response(json.dumps(links), mimetype='application/json')
    return render_template('index.html', linkss=json.dumps(links))

复制代码

3. 启动

if __name__ == "__main__":    
    """初始化"""
    app.run(host=''+ip, port=80,threaded=True)
复制代码

这里的端口是80,ip是默认本机ip(你们运行代码访问时候,输入自己的本机ip即可)

运行py代码后,出现上述界面说明启动成功

接着在浏览器里面访问

http://127.0.0.1/getdata?name=明星名字
复制代码

这里的明星名字是任意一位明星,比如:李易峰

http://127.0.0.1/getdata?name=李易峰
复制代码

Image

http://127.0.0.1/getdata?name=成龙
复制代码

Image

4. 小结

本文获取了七次全国人口普查数据,并进行了可视化展示。