大家好,我是阿辰~
今天教大家獲取采集(某度百科)的明星人物關系數據,並進行圖譜可視化展示。
亮點(難點):
1.動態查詢(輸入任意明星名字就可以查詢該明星關系人物)。
2.圖譜展示(以及key-value形式)
具體介紹就不多講了,先上效果:
可以在鏈接里面輸入對應的明星名稱就可以獲取對應的人物關系圖譜(還支持拖拽),比如:李易峰
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. 小結
本文獲取了明星人物關系動態數據,並進行了可視化展示, 源代碼在下方獲取。
本文完整源碼和數據獲取方式,在阿辰的朋友圈有完整源碼下載地址
需要的小伙伴可以去逛一下阿辰的朋友圈(還沒有添加阿辰微信的小伙伴,下方可以掃碼添加)
最后說一聲:原創不易,求給個贊、在看
、評論
推薦閱讀
爬蟲+可視化|爬取「奔跑吧」全系列嘉賓名單,並進行可視化分析