1.先找到百度热搜风云榜。
2.需要插件selenium,这个插件使用起来非常方便,可以模拟打开浏览器,找到数据的位置。
使用的时候要导入
from selenium.webdriver import Chrome,ChromeOptions
还需要下载一个谷歌驱动,在创建浏览器对象的时候要指明驱动的位置,否则无法使用
3.接下来就可以定位元素进行爬取,这儿我是用的是Xpath定位,并将其保存到数据库
1 def baidu_hot(): 2 url = "http://top.baidu.com/buzz?b=42&c=513&fr=topbuzz_b1_c513" 3 option = ChromeOptions() 4 option.add_argument("--headless") #隐藏浏览器,在运行的时候不会自动打开浏览器 5 res = requests.get(url) 6 #创建浏览器对象 7 #r"F:\pycharm_project\chromedriver.exe" 8 brower = Chrome("F:\pycharm_project\chromedriver.exe") #需要写入驱动的安装路径,否则无法使用驱动导致报错 9 brower.get(url) 10 contents = brower.find_elements_by_xpath('//*[@id="main"]/div[2]/div/table/tbody/tr/td[2]/a[1]')# xpath 路径来找到热搜内容 11 clicks = brower.find_elements_by_xpath('//*[@id="main"]/div[2]/div/table/tbody/tr/td[4]/span') # xpath 路径找到点击量 12 content,click = [],[] 13 content = [i.text for i in contents] #列表推导式来简化代码 并且保存到content列表中 14 click = [i.text for i in clicks] 15 brower.close() 16 return content,click 17 18 def get_serachhot(): 19 cursor = None 20 conn = None 21 context = baidu_hot()[0] 22 click = baidu_hot()[1] 23 dict = {context[i]:click[i] for i in range(len(context))} 24 print(f'{time.asctime()}开始更新热搜榜') 25 conn,cursor = get_conn() 26 sql = "insert into baidu_hot(datetime,content,click) values(%s,%s,%s)" 27 sql_clean = "TRUNCATE TABLE baidu_hot" 28 cursor.execute(sql_clean) 29 ts = time.strftime("%Y-%m-%d %X") 30 for key,value in dict.items(): 31 cursor.execute(sql,(ts,key,value)) 32 conn.commit() 33 print(f'{time.asctime()}更新热搜榜完毕') 34 close_conn(conn,cursor)热搜爬取
这样就把实时数据爬取到的数据库
4.接下来可以进行词云图的制作
4.1要想制作词云图,要先用ajax把数据取从数据库读出来。
1 @app.route('/r2') 2 def get_r2_data(): 3 """ 4 5 :return: 返回最近的20条热搜 6 """ 7 sql = 'select content,click from baidu_hot order by click desc limit 20' 8 res = query(sql) #格式 (('杭州杀妻嫌犯疑似涉及另一桩命案', 819272), ('四川安岳男子趁妻子熟睡将其杀害', 795389)) 9 d = [] 10 for i in res: 11 k = i[0] # 移除热搜数字 12 v = i[1] # 获取热搜数字 13 ks = extract_tags(k) # 使用jieba 提取关键字 14 for j in ks: 15 if not j.isdigit(): 16 d.append({"name": j, "value": v}) 17 return jsonify({"kws": d})取出热搜数据
4.2用echarts制作词云图
<script src="../static/js/echarts-wordcloud.min.js"></script>
这个云图的包是必不可少的
最后进行云图的数据配置
1 var ec_right2 = echarts.init(document.getElementById('r2'), "dark"); 2 var ec_right2_option = { 3 // backgroundColor: '#515151', 4 title : { 5 text : "7日百度热搜", 6 textStyle : { 7 color : 'white', 8 }, 9 left : 'left' 10 }, 11 tooltip: { 12 show: false 13 }, 14 series: [{ 15 type: 'wordCloud', 16 // drawOutOfBound:true, 17 gridSize: 1, 18 sizeRange: [12, 55], 19 rotationRange: [-45, 0, 45, 90], 20 // maskImage: maskImage, 21 textStyle: { 22 normal: { 23 color: function () { 24 return 'rgb(' + 25 Math.round(Math.random() * 255) + 26 ', ' + Math.round(Math.random() * 255) + 27 ', ' + Math.round(Math.random() * 255) + ')' 28 } 29 } 30 }, 31 // left: 'center', 32 // top: 'center', 33 // // width: '96%', 34 // // height: '100%', 35 right: null, 36 bottom: null, 37 // width: 300, 38 // height: 200, 39 // top: 20, 40 data: [] 41 }] 42 } 43 44 ec_right2.setOption(ec_right2_option);词云图配置
这样工作就基本完成了,来看看效果: