爬取搜狗热搜榜数据制成南丁格尔图

2023-11-07 17:59

本文主要是介绍爬取搜狗热搜榜数据制成南丁格尔图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验目的
1.在Windows平台上使用基本的Python语言结合Scrapy将搜狗热搜榜上的九个热门类型的数据进行爬取,并将爬取数据保存到本地数据库;
2.使用eclipse编辑工具结合echarts和jQuery等组件将爬取到的数据以南丁格尔图的形式展现出来。
实验原理
1.Scrapy结合xpath和Css可以很方便快捷的从获取到的网页中找出所需标签的文本内容,同时可以为爬取到的数据建模,在存储数据的时候免去了对数据的繁琐处理;
2.Python结合Scrapy可以在短时间内快速的爬取多个网页的内容,通过对网页内容的分析处理找出所需的数据,同时Python通过pymysql可以直接操作MySQL数据库,这样就可以把网页上爬取到的想要的数据直接存储到数据库中。
实验环境
Windows10-64位操作系统
Python-3.6.1
Scrapy-1.3.3
Eclipse-Mars.1 Release (4.5.1)
Apache Tomcat v8.0
MySQL Ver 14.14 Distrib 5.5.37, for Win32 (x86)
Google Chrome
实验内容
搜狗热搜榜网页中有九个热门的类型,比如有热门电影、热门电视剧、热门游戏等,每个热门的类型都提供了十个热门数据,每个热门数据中都包含着数据的名字以及搜索指数,南丁格尔图可以直观的对每个热门类型的数据进行比较,将热搜榜的九个类型做成南丁格尔图显示出来。
这是搜狗热搜榜2017-4-26九个热门类型的数据图
这里写图片描述
这里写图片描述
九个热门类型的南丁格尔图
实验步骤
<一、安装Python3.6.1、Scrapy>

Windows:
1>从https://www.python.org/downloads/上安装Python3.6.1
这里写图片描述
2>下载后的安装文件
这里写图片描述
3>双击进行安装:
这里写图片描述
4>点击下一步
这里写图片描述
5>下一步
这里写图片描述
6>安装完成后退出。打开DOS命令行,查询Python版本

python --version

7>从https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/下载安装pywin32
请确认下载符合系统的pywin32版本(win32或者amd64)
这里写图片描述
8>双击进行安装即可。安装完成后,打开DOS命令行进行安装Scrapy

pip install Scrapy

9>安装完成后,输入命令查看Scrapy版本:

Scrapy -V

这里写图片描述
< 二、使用Scrapy 进行数据的爬取>

1.打开DOS命令行,进入桌面:

cd Desktop

2.使用Scrapy创建爬虫项目,名字为resou:

scrapy startproject resou

3.resou文件夹->resou文件夹->spider文件夹,手动创建一个Python文件,名字为resou.py(创建一个文本文档,更改名字和后缀为:resou.py)
这里写图片描述
4.右键点击resou.py文件,用IDLE编写Python文件
这里写图片描述
5>编辑爬取数据的代码:

#导入Scrapy包和pymysql包
import scrapy
import pymysql
#pymysql包是Python连接MySQL数据库所需要的包#创建ReSouSpider类,继承scrapy.Spider类
class ReSouSpider(scrapy.Spider):#为爬虫定义一个名字(这个名字必须是独一无二的)name = "ReSouSpider"#爬虫爬取网页的域allowed_domains=['http://top.sogou.com/']#爬取网页的链接start_urls = ['http://top.sogou.com/']#定义parse函数def parse(self,response):#网页中控制九个热门类型的div标签divs = ['//div[@class="section s1"]','//div[@class="section s2"]','//div[@class="section s3"]','//div[@class="section s4"]','//div[@class="section s5"]','//div[@class="section s6"]','//div[@class="section s7"]','//div[@class="section s8"]','//div[@class="section s9"]']#循环读取九个标签中的数据for div in divs:#这里获取到的是对应热门类型的第一条内容的名字FName= response.xpath(div+'/ul/li/div[@class="txt-box"]/p/a/text()').extract()#这里读取到的是对应热门类型的第一条内容对应的搜索指数FStringData = response.xpath(div+'/ul/li/div[@class="txt-box"]/p/text()')[0].extract()#获取搜索指数中的数据FData=FStringData.split(":")[-1]#这里读取到的是对应热门类型从第二条内容开始读取到的内容名字集ONames = response.xpath(div+'/ul/li/a/text()').extract()#连接数据库conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",passwd="wph",db="r",charset='utf8mb4')cursor = conn.cursor()#获取到含有数据表名字的字符串tableStringName = response.xpath(div+'/div/a/@href')[0].extract()#通过截取字符串获取到数据表的名字tableName = tableStringName.split('/')[0]try:#创建数据表,包含三条记录,(id 主键,自增,name,value)cursor.execute("create table "+tableName+"(id int NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,value varchar(255) NOT NULL,PRIMARY KEY (id))")#将爬取到的热门类型的第一条内容的名字和搜索指数存储到数据表cursor.execute("insert into "+tableName+"(name,value)values(%s,%s)",(FName,FData))#存储够进行提交,没有提交将不会保存到数据库的表中conn.commit()Index=0#开始遍历其他内容的名字for EName in ONames:#获取到从热门类型从第二条记录开始的数据集中的数据OData=response.xpath(div+'/ul/li/span/text()')[Index].extract()Index+=1#将热门类型从第二开始的数据保存到数据库表中cursor.execute("insert into "+tableName+"(name,value) values(%s,%s)",(EName,OData))conn.commit()finally:cursor.close()conn.close()

6>这样爬取网页的爬虫代码就编写好了,下一步就可以爬取网页了,打开DOS命令行,进入之前创建好的resou文件夹,开始爬取数据:

cd resou
scrapy crawl ReSouSpider

7>输入命令点击回车后,爬虫就开始自动爬取数据了,等到出现下图是,就爬取结束。
这里写图片描述
8>接下来就可以去数据库中查看爬取下的数据了,在DOS命令行登录数据库查看数据,记住自己的账号和密码哦

mysql -u数据库用户 -p数据库密码
show databases;
use resou;
show tables;

就会出现九个热门类型的数据表了,你可以挨个查看每个数据表中的数据
这里写图片描述

select * from animation

或者你可以通过数据库可视化工具来查看我们爬取下的数据表和其中的数据:
这里写图片描述
这里写图片描述
这里写图片描述
这里我们的爬虫爬取数据就结束了,这个过程中我们爬取了搜狗热搜榜上九个热门类型的数据,并把每个热门类型的前十条数据的名字和热搜数据保存到了mysql数据库,接下来我们就开始把这些数据做成南丁格尔图吧。
<三、借助Eclipse结合Echarts等组件做南丁格尔图>
1>打开Eclipse,创建一个动态web工程,名字就取为Echarts-NDGE
这里写图片描述
这里写图片描述
2>在webcontent->WEB-INFO->lib中导入所需要的jar包,并将他们加入到路径中去
这里写图片描述
3>在webcontent文件下创建js文件夹,用来存放js文件
这里写图片描述
这里写图片描述
4>在创建好的js文件中加入我们需要用到的echarts和jquery这两个js文件
这里写图片描述
5>导包结束和文件添加结束后,我们就正式开始编程了,先从获取MySQL数据库的数据入手,在src下建立一个名为AccessDataDButil包,里边创建一个名为DButil的java文件
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
6>DButil.java中的代码如下;主要是连接数据库,在其他类调用时返回这个连接;

package AccessDataDButil;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DButil {private Connection connection;public Connection getConnection(){try {//加载驱动Class.forName("org.gjt.mm.mysql.Driver");//驱动连接数据库connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/resou","root","wph");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}//返回connectionreturn connection;}public void ConnClose(){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

7>在src文件下创建一个DataModel包,里边创建一个DataEntity.java文件;
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
在DataEntity中,对数据进行建模,规定数据的类型;

package DataModel;public class DataEntity {private String name;private float value;public String getName() {return name;}public void setName(String name) {this.name = name;}public float getValue() {return value;}public void setValue(float value) {this.value = value;}}

8>在src文件下创建一个AccessDataDAO包,里边创建一个AccessDao.java文件;
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
在AccessDao文件中编写代码,主要是获取数据库的连接,然后通过sql语句进行获取数据表中的数据。

package AccessDataDAO;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;import AccessDataDButil.DButil;
import DataModel.DataEntity;public class AccessDao {Connection conn;DButil db;ResultSet set;Statement st;public List<DataEntity> getAttribute(String TableName){db=new DButil();conn=db.getConnection();String sql = "select name,value from "+TableName;List<DataEntity> list = new ArrayList<DataEntity>();try {st = conn.createStatement();set = st.executeQuery(sql);while (set.next()) {DataEntity entity = new DataEntity();entity.setName(set.getString("name"));entity.setValue(Float.parseFloat(set.getString("value")));list.add(entity);}} catch (SQLException e) {System.err.println(e.getMessage());}return list;}}

9>在src下面创建一个DataService包,在包下边创建一个getData.java文件
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
在getData文件中,对获取到的数据进行处理,并进行数据的传送;

package DataService;import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.alibaba.fastjson.JSON;import AccessDataDAO.AccessDao;
import DataModel.DataEntity;public class getData extends HttpServlet{public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//编码类型response.setContentType("text/html;charset=utf-8");String[] dbName= {"movie","animation","book","people","auto","game","song","tvplay","tvshow"};AccessDao dao=new AccessDao();List<DataEntity> list0,list1,list2,list3,list4,list5,list6,list7,list8;list0=dao.getAttribute(dbName[0]);list1=dao.getAttribute(dbName[1]);list2=dao.getAttribute(dbName[2]);list3=dao.getAttribute(dbName[3]);list4=dao.getAttribute(dbName[4]);list5=dao.getAttribute(dbName[5]);list6=dao.getAttribute(dbName[6]);list7=dao.getAttribute(dbName[7]);list8=dao.getAttribute(dbName[8]);String jsonString0=JSON.toJSONString(list0);String jsonString1="?"+JSON.toJSONString(list1);String jsonString2="?"+JSON.toJSONString(list2);String jsonString3="?"+JSON.toJSONString(list3);String jsonString4="?"+JSON.toJSONString(list4);String jsonString5="?"+JSON.toJSONString(list5);String jsonString6="?"+JSON.toJSONString(list6);String jsonString7="?"+JSON.toJSONString(list7);String jsonString8="?"+JSON.toJSONString(list8);PrintWriter out = response.getWriter();out.print(jsonString0);out.print(jsonString1);out.print(jsonString2);out.print(jsonString3);out.print(jsonString4);out.print(jsonString5);out.print(jsonString6);out.print(jsonString7);out.print(jsonString8);//System.out.println(list.toString());out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

10>在webcontent->WEB-INFO下边创建web.xml文件;
这里写图片描述
这里写图片描述
这里写图片描述
web.xml中代码为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>EchartTest</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>getData</servlet-name><servlet-class>DataService.getData</servlet-class></servlet><servlet-mapping><servlet-name>getData</servlet-name><url-pattern>/getData</url-pattern></servlet-mapping></web-app>

11>在webcontent下边创建一个showPicture.jsp文件,编写显示南丁格尔图的代码:
这里写图片描述
这里写图片描述
showPicture.jsp中的代码:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 引入Jquery包 -->
<script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
<!-- 引入Echarts包 -->
<script type="text/javascript" src="js/echarts.min.js"></script></head>
<body bgcolor="#F0F0F0">
<h1 align="center">南丁格尔玫瑰图</h1><br>
<hr><br/><div id="main" style="width: 1400px;height:1000px;"></div></body>
<script type="text/javascript">// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 指定图表的配置项和数据myChart.setOption({title : {text: '本数据来自搜狗热搜榜---2017.04.27',x:'center'},tooltip : {trigger: 'item',formatter: "{a} <br/>{b} : {c} ({d}%)"},toolbox: {show : true,feature : {mark : {show: true},dataView : {show: true, readOnly: false},magicType : {show: true,type: ['pie', 'funnel']},restore : {show: true},saveAsImage : {show: true}}},calculable : true,series : [{name:'热门电影',type:'pie',radius : [30, 110],center : ['20%', '20%'],roseType : 'area',data:[]},{name:'热门动漫',type:'pie',radius : [30, 110],center : ['50%', '20%'],roseType : 'area',data:[]},{name:'热门小说',type:'pie',radius : [30, 110],center : ['80%', '20%'],roseType : 'area',data:[]},{name:'热门人物',type:'pie',radius : [30, 110],center : ['20%', '50%'],roseType : 'area',data:[]},{name:'热门汽车',type:'pie',radius : [30, 110],center : ['50%', '50%'],roseType : 'area',data:[]},{name:'热门游戏',type:'pie',radius : [30, 110],center : ['80%', '50%'],roseType : 'area',data:[]},{name:'热门音乐',type:'pie',radius : [30, 110],center : ['20%', '80%'],roseType : 'area',data:[]},{name:'热门电视剧',type:'pie',radius : [30, 110],center : ['50%', '80%'],roseType : 'area',data:[]},{name:'热门综艺',type:'pie',radius : [30, 110],center : ['80%', '80%'],roseType : 'area',data:[]}]});// 异步加载数据var info = {"opt": "pie"};$.post("./getData", info, function(data){var dat=data.split("?");var dat0=JSON.parse(dat[0]);var dat1=JSON.parse(dat[1]);var dat2=JSON.parse(dat[2]);var dat3=JSON.parse(dat[3]);var dat4=JSON.parse(dat[4]);var dat5=JSON.parse(dat[5]);var dat6=JSON.parse(dat[6]);var dat7=JSON.parse(dat[7]);var dat8=JSON.parse(dat[8]);/* for(var i=0; i < data.length; i++){mapOnlyKey.push( data[i].name);mapKeyValue.push({"value":data[i].value, "name": data[i].name });mapOnlyValue.push( data[i].value );}console.log(mapOnlyKey);console.log(mapKeyValue);console.log(mapOnlyValue);alert(mapKeyValue); */// 填入数据myChart.setOption({series: [{data: dat0},{data: dat1},{data: dat2},{data: dat3},{data: dat4},{data: dat5},{data: dat6},{data: dat7},{data: dat8}]});// 使用刚指定的配置项和数据显示图表。}); </script>
</html>

12>所有的工作都做完了,接下来运行jsp页面,来看看我们做的南丁格尔图吧
这里写图片描述
这里写图片描述
为了更好的查看,我们将链接复制下来,去浏览器上查看吧:
这里写图片描述
这里写图片描述
好了,这就是我们要展示的九个热门类型的南丁格尔图,通过这个图,我们可以清楚直观的看到热搜榜上各个热门类型的情况。

这篇关于爬取搜狗热搜榜数据制成南丁格尔图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365349

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者