大家好,我是辰哥~
今天教大家获取采集(某度百科)的明星人物关系数据,并进行图谱可视化展示。
亮点(难点):
1.动态查询(输入任意明星名字就可以查询该明星关系人物)。
2.图谱展示(以及 key-value 形式)
具体介绍就不多讲了,先上效果:
演示视频
可视化实战教学|教你用 30 行 python 代码查询明星关系
可以在链接里面输入对应的明星名称就可以获取对应的人物关系图谱(还支持拖拽),比如:李易峰
1. 采集数据
在百度里面搜索:李易峰
可以在明星这栏里面看到明星关系
下面开始定位网页标签
可以看到数据是在 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]
复制代码
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=李易峰
复制代码
http://127.0.0.1/getdata?name=成龙
复制代码
4. 小结
本文获取了七次全国人口普查数据,并进行了可视化展示。
评论