⭐️基础链接导航⭐️
服务器 → ☁️ 阿里云活动地址
看样例 → 🐟 摸鱼小网站地址
学代码 → 💻 源码库地址
一、前言
大家好呀,我是summo,前面已经教会大家怎么去阿里云买服务器(链接在这,需要自取),以及怎么搭建JDK、Redis、MySQL这些环境。从这篇文章开始就进入正式的编码阶段了,我们从后端开始,先把热搜数据获取到,然后再开始前端部分。
本来我想把后端应用搭建和完成第一个爬虫分为两篇文章写的,但是想到墨迹三周还没看到效果,估计有些同学已经等不及了,所以我把这两篇文章合成一篇了,篇幅比较长,感兴趣的同学可以认真看下。因为后端应用初始化的时候涉及很多配置,有很多命名,建议大家写别急着个性化用自己的名字命名应用和配置,可以先用我的命名方式搭建一个出来,先成功再研究个性化,这样成就感很足,学习动力也强。
二、后端应用搭建
这个摸鱼小网站主要使用的SpringBoot框架配合一些中间件实现,开发工具用的是idea社区版,建议不要下载人家的正式版然后破解,一来麻烦的很,二来社区版足够开发使用了,点击这个可以下载idea社区版。
1. maven项目搭建
打开idea后,点击New Project,我们从一个空的maven项目开始,一步步把项目搭建出来。

我们输入name、GroupId、ArtifactId点击确定,如果你是老手可以自己搭建,如果你是新手建议跟我输的一样,因为后面还有很多地方要用的这些名字。

把src目录删掉,我们不需要,只留下pom.xml文件就行了。

接下来我们开始创建子module,创建方式如下图:

以summo-sbmy-start子module为例,输入如下的信息就可以创建一个module出来啦。

按照这个方式创建出如下的module出来。

2. pom.xml配置
这部分我现在不详细说,后面我会单独写一篇文章讲我的依赖和配置。如果刚才你的名字取得跟我一样,直接复制粘贴就完事了,如果名字不一样记得把名字给替换为你的。
(1)summo-sbmy
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <parent> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-parent</artifactId> 10 <version>2.7.15</version> 11 <relativePath/> <!-- lookup parent from repository --> 12 </parent> 13 14 <groupId>com.summo</groupId> 15 <artifactId>summo-sbmy</artifactId> 16 <packaging>pom</packaging> 17 <version>1.0-SNAPSHOT</version> 18 <modules> 19 <module>summo-sbmy-dao</module> 20 <module>summo-sbmy-service</module> 21 <module>summo-sbmy-web</module> 22 <module>summo-sbmy-start</module> 23 <module>summo-sbmy-job</module> 24 <module>summo-sbmy-common</module> 25 </modules> 26 27 <properties> 28 <maven.compiler.source>8</maven.compiler.source> 29 <maven.compiler.target>8</maven.compiler.target> 30 </properties> 31 32 <dependencyManagement> 33 <dependencies> 34 35 <!-- 自依赖 --> 36 <dependency> 37 <groupId>com.summo</groupId> 38 <artifactId>summo-sbmy-common</artifactId> 39 <version>${project.version}</version> 40 </dependency> 41 <dependency> 42 <groupId>com.summo</groupId> 43 <artifactId>summo-sbmy-service</artifactId> 44 <version>${project.version}</version> 45 </dependency> 46 <dependency> 47 <groupId>com.summo</groupId> 48 <artifactId>summo-sbmy-common</artifactId> 49 <version>${project.version}</version> 50 </dependency> 51 <dependency> 52 <groupId>com.summo</groupId> 53 <artifactId>summo-sbmy-dao</artifactId> 54 <version>${project.version}</version> 55 </dependency> 56 <dependency> 57 <groupId>com.summo</groupId> 58 <artifactId>summo-sbmy-job</artifactId> 59 <version>${project.version}</version> 60 </dependency> 61 <dependency> 62 <groupId>com.summo</groupId> 63 <artifactId>summo-sbmy-start</artifactId> 64 <version>${project.version}</version> 65 </dependency> 66 <dependency> 67 <groupId>com.summo</groupId> 68 <artifactId>summo-sbmy-web</artifactId> 69 <version>${project.version}</version> 70 </dependency> 71 72 <!-- xxl-job --> 73 <dependency> 74 <groupId>com.xuxueli</groupId> 75 <artifactId>xxl-job-core</artifactId> 76 <version>2.2.0</version> 77 </dependency> 78 79 <!-- MySQL驱动 --> 80 <dependency> 81 <groupId>mysql</groupId> 82 <artifactId>mysql-connector-java</artifactId> 83 <version>8.0.20</version> 84 </dependency> 85 86 <!-- mybatis-plus驱动 --> 87 <dependency> 88 <groupId>com.baomidou</groupId> 89 <artifactId>mybatis-plus-boot-starter</artifactId> 90 <version>3.3.2</version> 91 </dependency> 92 <dependency> 93 <groupId>com.baomidou</groupId> 94 <artifactId>mybatis-plus-extension</artifactId> 95 <version>3.3.2</version> 96 </dependency> 97 98 <!-- 分页插件 --> 99 <dependency> 100 <groupId>com.github.pagehelper</groupId> 101 <artifactId>pagehelper-spring-boot-starter</artifactId> 102 <version>1.4.1</version> 103 </dependency> 104 105 <!-- lombok --> 106 <dependency> 107 <groupId>org.projectlombok</groupId> 108 <artifactId>lombok</artifactId> 109 <version>1.16.22</version> 110 </dependency> 111 112 <!-- druid链接池 --> 113 <dependency> 114 <groupId>com.alibaba</groupId> 115 <artifactId>druid-spring-boot-starter</artifactId> 116 <version>1.1.22</version> 117 </dependency> 118 119 <!-- aspectj --> 120 <dependency> 121 <groupId>org.aspectj</groupId> 122 <artifactId>aspectjweaver</artifactId> 123 <version>1.9.5</version> 124 </dependency> 125 126 <!-- fastjson --> 127 <dependency> 128 <groupId>com.alibaba</groupId> 129 <artifactId>fastjson</artifactId> 130 <version>2.0.21</version> 131 </dependency> 132 133 <!-- 线程上下文 --> 134 <dependency> 135 <groupId>com.alibaba</groupId> 136 <artifactId>transmittable-thread-local</artifactId> 137 <version>2.11.1</version> 138 </dependency> 139 140 <!-- 接口参数校验 --> 141 <dependency> 142 <groupId>javax.validation</groupId> 143 <artifactId>validation-api</artifactId> 144 <version>2.0.1.Final</version> 145 </dependency> 146 147 <!-- Redisson分布式锁 --> 148 <dependency> 149 <groupId>org.redisson</groupId> 150 <artifactId>redisson-spring-boot-starter</artifactId> 151 <version>3.24.0</version> 152 </dependency> 153 154 <!-- 通用工具类 --> 155 <dependency> 156 <groupId>org.apache.commons</groupId> 157 <artifactId>commons-lang3</artifactId> 158 <version>3.5</version> 159 </dependency> 160 <dependency> 161 <groupId>org.apache.commons</groupId> 162 <artifactId>commons-collections4</artifactId> 163 <version>4.1</version> 164 </dependency> 165 166 <!-- VM 模板 --> 167 <dependency> 168 <groupId>com.alibaba.boot</groupId> 169 <artifactId>velocity-spring-boot-starter</artifactId> 170 <version>1.0.4.RELEASE</version> 171 </dependency> 172 173 <!-- guava --> 174 <dependency> 175 <groupId>com.google.guava</groupId> 176 <artifactId>guava</artifactId> 177 <version>32.1.1-jre</version> 178 </dependency> 179 180 <!-- httpclient --> 181 <dependency> 182 <groupId>org.apache.httpcomponents</groupId> 183 <artifactId>httpcore</artifactId> 184 <version>4.4.16</version> 185 </dependency> 186 <dependency> 187 <groupId>org.apache.httpcomponents</groupId> 188 <artifactId>httpclient</artifactId> 189 <version>4.5.14</version> 190 </dependency> 191 192 <!-- jsoup --> 193 <dependency> 194 <groupId>org.jsoup</groupId> 195 <artifactId>jsoup</artifactId> 196 <version>1.12.1</version> 197 </dependency> 198 199 <!-- ip2region --> 200 <dependency> 201 <groupId>org.lionsoul</groupId> 202 <artifactId>ip2region</artifactId> 203 <version>2.6.3</version> 204 </dependency> 205 206 <!-- 用于读取ip2region.xdb文件使用 --> 207 <dependency> 208 <groupId>commons-io</groupId> 209 <artifactId>commons-io</artifactId> 210 <version>2.6</version> 211 </dependency> 212 213 <!-- 加解密代码--> 214 <dependency> 215 <groupId>org.bouncycastle</groupId> 216 <artifactId>bcprov-jdk15on</artifactId> 217 <version>1.68</version> 218 </dependency> 219 <dependency> 220 <groupId>commons-codec</groupId> 221 <artifactId>commons-codec</artifactId> 222 <version>1.15</version> 223 </dependency> 224 </dependencies> 225 </dependencyManagement> 226 227 <build> 228 <plugins> 229 <plugin> 230 <groupId>org.apache.maven.plugins</groupId> 231 <artifactId>maven-compiler-plugin</artifactId> 232 <version>3.8.1</version> 233 <configuration> 234 <source>1.8</source> 235 <target>1.8</target> 236 <encoding>utf-8</encoding> 237 </configuration> 238 </plugin> 239 <plugin> 240 <groupId>org.apache.maven.plugins</groupId> 241 <artifactId>maven-source-plugin</artifactId> 242 <version>2.2</version> 243 <executions> 244 <execution> 245 <id>attach-sources</id> 246 <goals> 247 <goal>jar</goal> 248 </goals> 249 </execution> 250 </executions> 251 <configuration> 252 <finalName>${project.build.finalName}</finalName> 253 </configuration> 254 </plugin> 255 </plugins> 256 </build> 257</project>
(2)summo-sbmy-start
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>summo-sbmy</artifactId> 7 <groupId>com.summo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>summo-sbmy-start</artifactId> 13 14 <properties> 15 <maven.compiler.source>8</maven.compiler.source> 16 <maven.compiler.target>8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>com.summo</groupId> 22 <artifactId>summo-sbmy-service</artifactId> 23 </dependency> 24 <dependency> 25 <groupId>com.summo</groupId> 26 <artifactId>summo-sbmy-job</artifactId> 27 </dependency> 28 <dependency> 29 <groupId>com.summo</groupId> 30 <artifactId>summo-sbmy-dao</artifactId> 31 </dependency> 32 <dependency> 33 <groupId>com.summo</groupId> 34 <artifactId>summo-sbmy-common</artifactId> 35 </dependency> 36 <dependency> 37 <groupId>com.summo</groupId> 38 <artifactId>summo-sbmy-web</artifactId> 39 </dependency> 40 41 <!-- 测试组件 --> 42 <dependency> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-starter-test</artifactId> 45 <scope>test</scope> 46 </dependency> 47 <dependency> 48 <groupId>junit</groupId> 49 <artifactId>junit</artifactId> 50 <scope>test</scope> 51 </dependency> 52 </dependencies> 53 54 <!-- 添加四个环境的变量,变量名为environment --> 55 <profiles> 56 <profile> 57 <id>test</id> 58 <activation> 59 <activeByDefault>true</activeByDefault> 60 </activation> 61 <properties> 62 <environment>test</environment> 63 </properties> 64 </profile> 65 <profile> 66 <id>consumer</id> 67 <properties> 68 <environment>consumer</environment> 69 </properties> 70 </profile> 71 <profile> 72 <id>producer</id> 73 <properties> 74 <environment>producer</environment> 75 </properties> 76 </profile> 77 </profiles> 78 79 <build> 80 <finalName>summo-sbmy</finalName> 81 <resources> 82 <resource> 83 <!-- 指定配置文件所在的resource目录 --> 84 <directory>src/main/resources</directory> 85 <includes> 86 <include>application.properties</include> 87 <include>logback-spring.xml</include> 88 <include>**/*.html</include> 89 <include>**/*.js</include> 90 <include>**/*.css</include> 91 </includes> 92 <filtering>true</filtering> 93 </resource> 94 <resource> 95 <!-- 指定配置文件所在的resource目录 --> 96 <directory>src/main/resources</directory> 97 <includes> 98 <include>**/*.woff</include> 99 <include>**/*.ttf</include> 100 <include>**/*.xdb</include> 101 <include>**/*.jks</include> 102 </includes> 103 <filtering>false</filtering> 104 </resource> 105 </resources> 106 <plugins> 107 <plugin> 108 <groupId>org.springframework.boot</groupId> 109 <artifactId>spring-boot-maven-plugin</artifactId> 110 <version>2.1.13.RELEASE</version> 111 <executions> 112 <execution> 113 <goals> 114 <goal>repackage</goal> 115 </goals> 116 </execution> 117 </executions> 118 <configuration> 119 <mainClass>com.summo.sbmy.Application</mainClass> 120 </configuration> 121 </plugin> 122 <!-- 解压fat jar到target/${project-name}目录 --> 123 <plugin> 124 <artifactId>maven-antrun-plugin</artifactId> 125 <executions> 126 <execution> 127 <phase>package</phase> 128 <configuration> 129 <target> 130 <unzip 131 src="${project.build.directory}/${project.build.finalName}.${project.packaging}" 132 dest="${project.build.directory}/summo-sbmy"/> 133 </target> 134 </configuration> 135 <goals> 136 <goal>run</goal> 137 </goals> 138 </execution> 139 </executions> 140 </plugin> 141 </plugins> 142 </build> 143</project> 144
(3)summo-sbmy-common
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>summo-sbmy</artifactId> 7 <groupId>com.summo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>summo-sbmy-common</artifactId> 13 14 <properties> 15 <maven.compiler.source>8</maven.compiler.source> 16 <maven.compiler.target>8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <!-- SpringBoot框架 --> 21 <dependency> 22 <groupId>org.springframework.boot</groupId> 23 <artifactId>spring-boot-starter-web</artifactId> 24 </dependency> 25 26 <!-- lombok --> 27 <dependency> 28 <groupId>org.projectlombok</groupId> 29 <artifactId>lombok</artifactId> 30 </dependency> 31 32 <!-- aspectj --> 33 <dependency> 34 <groupId>org.aspectj</groupId> 35 <artifactId>aspectjweaver</artifactId> 36 <version>1.9.5</version> 37 </dependency> 38 39 <!-- logback核心组件 --> 40 <dependency> 41 <groupId>ch.qos.logback</groupId> 42 <artifactId>logback-core</artifactId> 43 </dependency> 44 45 <!-- fastjson --> 46 <dependency> 47 <groupId>com.alibaba</groupId> 48 <artifactId>fastjson</artifactId> 49 </dependency> 50 51 <!-- 线程上下文 --> 52 <dependency> 53 <groupId>com.alibaba</groupId> 54 <artifactId>transmittable-thread-local</artifactId> 55 </dependency> 56 <!-- 分页插件 --> 57 <dependency> 58 <groupId>com.github.pagehelper</groupId> 59 <artifactId>pagehelper-spring-boot-starter</artifactId> 60 <version>1.4.1</version> 61 </dependency> 62 <!-- 接口参数校验 --> 63 <dependency> 64 <groupId>javax.validation</groupId> 65 <artifactId>validation-api</artifactId> 66 </dependency> 67 68 <dependency> 69 <groupId>com.squareup.okhttp3</groupId> 70 <artifactId>okhttp</artifactId> 71 </dependency> 72 <!-- Redis框架 --> 73 <dependency> 74 <groupId>org.springframework.boot</groupId> 75 <artifactId>spring-boot-starter-data-redis</artifactId> 76 </dependency> 77 78 <!-- Redisson分布式锁 --> 79 <dependency> 80 <groupId>org.redisson</groupId> 81 <artifactId>redisson-spring-boot-starter</artifactId> 82 </dependency> 83 84 <!-- jedisÏ分布式锁 --> 85 <dependency> 86 <groupId>redis.clients</groupId> 87 <artifactId>jedis</artifactId> 88 </dependency> 89 <!-- 通用工具类 --> 90 <dependency> 91 <groupId>org.apache.commons</groupId> 92 <artifactId>commons-lang3</artifactId> 93 </dependency> 94 <dependency> 95 <groupId>org.apache.commons</groupId> 96 <artifactId>commons-collections4</artifactId> 97 </dependency> 98 99 <!-- guava --> 100 <dependency> 101 <groupId>com.google.guava</groupId> 102 <artifactId>guava</artifactId> 103 </dependency> 104 105 <!-- httpclient --> 106 <dependency> 107 <groupId>org.apache.httpcomponents</groupId> 108 <artifactId>httpcore</artifactId> 109 </dependency> 110 <dependency> 111 <groupId>org.apache.httpcomponents</groupId> 112 <artifactId>httpclient</artifactId> 113 </dependency> 114 115 <dependency> 116 <groupId>org.jsoup</groupId> 117 <artifactId>jsoup</artifactId> 118 </dependency> 119 120 <!-- ip2region --> 121 <dependency> 122 <groupId>org.lionsoul</groupId> 123 <artifactId>ip2region</artifactId> 124 </dependency> 125 126 <!-- 用于读取ip2region.xdb文件使用 --> 127 <dependency> 128 <groupId>commons-io</groupId> 129 <artifactId>commons-io</artifactId> 130 </dependency> 131 132 <!-- 加解密代码 --> 133 <dependency> 134 <groupId>org.bouncycastle</groupId> 135 <artifactId>bcprov-jdk15on</artifactId> 136 </dependency> 137 <dependency> 138 <groupId>commons-codec</groupId> 139 <artifactId>commons-codec</artifactId> 140 </dependency> 141 <dependency> 142 <groupId>com.google.code.gson</groupId> 143 <artifactId>gson</artifactId> 144 <version>2.8.6</version> 145 </dependency> 146 147 </dependencies> 148</project> 149
(4)summo-sbmy-dao
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>summo-sbmy</artifactId> 7 <groupId>com.summo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>summo-sbmy-dao</artifactId> 13 14 <properties> 15 <maven.compiler.source>8</maven.compiler.source> 16 <maven.compiler.target>8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>com.summo</groupId> 22 <artifactId>summo-sbmy-common</artifactId> 23 </dependency> 24 <!-- MySQL驱动 --> 25 <dependency> 26 <groupId>mysql</groupId> 27 <artifactId>mysql-connector-java</artifactId> 28 </dependency> 29 30 <!-- mybatis-plus驱动 --> 31 <dependency> 32 <groupId>com.baomidou</groupId> 33 <artifactId>mybatis-plus-boot-starter</artifactId> 34 </dependency> 35 <dependency> 36 <groupId>com.baomidou</groupId> 37 <artifactId>mybatis-plus-extension</artifactId> 38 </dependency> 39 <dependency> 40 <groupId>javax.persistence</groupId> 41 <artifactId>javax.persistence-api</artifactId> 42 </dependency> 43 44 <!-- druid链接池 --> 45 <dependency> 46 <groupId>com.alibaba</groupId> 47 <artifactId>druid-spring-boot-starter</artifactId> 48 </dependency> 49 50 </dependencies> 51 52 <build> 53 <plugins> 54 <plugin> 55 <groupId>org.mybatis.generator</groupId> 56 <artifactId>mybatis-generator-maven-plugin</artifactId> 57 <version>1.3.6</version> 58 <configuration> 59 <configurationFile>${basedir}/src/main/resources/generator/generatorConfiguration.xml 60 </configurationFile> 61 <overwrite>true</overwrite> 62 <verbose>true</verbose> 63 </configuration> 64 <dependencies> 65 <dependency> 66 <groupId>tk.mybatis</groupId> 67 <artifactId>mapper</artifactId> 68 <version>4.1.2</version> 69 </dependency> 70 </dependencies> 71 </plugin> 72 </plugins> 73 </build> 74</project> 75
(5)summo-sbmy-service
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>summo-sbmy</artifactId> 7 <groupId>com.summo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>summo-sbmy-service</artifactId> 13 14 <properties> 15 <maven.compiler.source>8</maven.compiler.source> 16 <maven.compiler.target>8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>com.summo</groupId> 22 <artifactId>summo-sbmy-dao</artifactId> 23 </dependency> 24 </dependencies> 25</project> 26
(6)summo-sbmy-web
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>summo-sbmy</artifactId> 7 <groupId>com.summo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>summo-sbmy-web</artifactId> 13 14 <properties> 15 <maven.compiler.source>8</maven.compiler.source> 16 <maven.compiler.target>8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>com.summo</groupId> 22 <artifactId>summo-sbmy-service</artifactId> 23 </dependency> 24 <!-- thymeleaf --> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter-thymeleaf</artifactId> 28 </dependency> 29 </dependencies> 30</project>
(7)summo-sbmy-job
pom.xml内容如下:
<details> <summary>点击展开代码</summary></details>1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>summo-sbmy</artifactId> 7 <groupId>com.summo</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>summo-sbmy-job</artifactId> 13 14 <properties> 15 <maven.compiler.source>8</maven.compiler.source> 16 <maven.compiler.target>8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>com.summo</groupId> 22 <artifactId>summo-sbmy-service</artifactId> 23 </dependency> 24 </dependencies> 25</project>
pom.xml配置贴好后,更新一下,把依赖包都下载下来。如果你发现下载的非常慢,把maven仓库的镜像换一下,换成阿里云的。镜像配置如下:
1<mirrors> 2 <mirror> 3 <id>alimaven</id> 4 <mirrorOf>central</mirrorOf> 5 <name>aliyun maven</name> 6 <url>https://maven.aliyun.com/repository/public</url> 7 </mirror> 8</mirrors>
3. application.properties配置
1## 应用名 2spring.application.name=summo-sbmy 3## 端口号 4server.port=8080 5 6# 配置Druid数据源类型 7spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 8# 数据库连接URL,包括数据库名、允许的公开密钥检索、字符编码、禁用SSL、时区设置等 9spring.datasource.url=jdbc:mysql://xxx:3306/summo-sbmy?allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull 10# 数据库用户名 11spring.datasource.username=xxx 12# 数据库密码 13spring.datasource.password=xxx 14# 数据库驱动类名 15spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 16# 初始化连接池时创建的连接数量 17spring.datasource.druid.initial-size=5 18# 连接池最大活跃连接数 19spring.datasource.druid.max-active=30 20# 连接池最小空闲连接数 21spring.datasource.druid.min-idle=5 22# 等待连接获取的最大等待时间 23spring.datasource.druid.max-wait=60000 24# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接 25spring.datasource.druid.time-between-eviction-runs-millis=60000 26# 配置一个连接在池中最小生存的时间 27spring.datasource.druid.min-evictable-idle-time-millis=300000 28# 验证数据库连接有效的SQL语句 29spring.datasource.druid.validation-query=SELECT 1 FROM DUAL 30# 是否在从连接池获取连接前进行检验(建议关闭,影响性能) 31spring.datasource.druid.test-while-idle=true 32# 获取连接时执行validationQuery检测连接是否有效(建议关闭,影响性能) 33spring.datasource.druid.test-on-borrow=false 34# 归还连接时执行validationQuery检测连接是否有效(建议关闭,影响性能) 35spring.datasource.druid.test-on-return=false 36# 是否开启PSCache(PreparedStatement缓存),默认false 37spring.datasource.druid.pool-prepared-statements=false 38# 指定每个连接上PSCache的大小,默认-1表示不限制 39spring.datasource.druid.max-pool-prepared-statement-per-connection-size=0 40# 启用监控统计和日志过滤器 41spring.datasource.druid.filters=stat,wall 42# 配置StatFilter的参数,合并SQL记录 43spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 44# 是否合并Druid数据源的监控信息 45spring.datasource.druid.use-global-data-source-stat=true 46# 开启Wall过滤器,并指定数据库类型为MySQL 47spring.datasource.druid.filter.wall.enabled=true 48spring.datasource.druid.filter.wall.db-type=mysql 49# 配置StatFilter的数据库类型为MySQL 50spring.datasource.druid.filter.stat.db-type=mysql 51# 开启StatFilter 52spring.datasource.druid.filter.stat.enabled=true 53 54# MyBatis配置:自动映射行为设置为全字段 55mybatis.configuration.auto-mapping-behavior=full 56# MyBatis配置:下划线转驼峰命名规则 57mybatis.configuration.map-underscore-to-camel-case=true 58# MyBatis-Plus的Mapper文件位置 59mybatis-plus.mapper-locations=classpath*:/mybatis/mapper/*.xml 60 61# Redis数据库索引 62spring.redis.database=0 63# Redis连接超时时间(毫秒) 64spring.redis.timeout=1800000 65# Redis服务器地址 66spring.redis.host=127.0.0.1 67# Redis服务器端口 68spring.redis.port=6379 69# Redis服务器连接密码 70spring.redis.password=xxx 71# 使用Lettuce连接池时的最大等待时间(-1表示无限制) 72spring.redis.lettuce.pool.max-wait=-1 73# Lettuce连接池的最大空闲连接数 74spring.redis.lettuce.pool.max-idle=5 75# Lettuce连接池的最小空闲连接数 76spring.redis.lettuce.pool.min-idle=0 77# Lettuce连接池的最大活跃连接数 78spring.redis.lettuce.pool.max-active=20 79# 使用Jedis连接池时的最小空闲连接数 80spring.redis.jedis.pool.min-idle=8 81# Jedis连接池的最大空闲连接数 82spring.redis.jedis.pool.max-idle=500 83# Jedis连接池的最大活跃连接数 84spring.redis.jedis.pool.max-active=2000 85# Jedis连接池的最大等待时间(毫秒) 86spring.redis.jedis.pool.max-wait=10000 87
4. logback-spring.xml配置
<details> <summary>点击展开代码</summary></details>1<configuration> 2 <!-- 默认的一些配置 --> 3 <include resource="org/springframework/boot/logging/logback/defaults.xml"/> 4 <!-- 定义应用名称,区分应用 --> 5 <property name="APP_NAME" value="summo-sbmy"/> 6 <!-- 定义日志文件的输出路径 --> 7 <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/> 8 <!-- 定义日志文件名称和路径 --> 9 <property name="LOG_FILE" value="${LOG_PATH}/application.log"/> 10 <!-- 定义警告级别日志文件名称和路径 --> 11 <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/> 12 <!-- 定义错误级别日志文件名称和路径 --> 13 <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/> 14 15 <!-- 自定义控制台打印格式 --> 16 <property name="FILE_LOG_PATTERN" value="%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%blue(requestId: %X{requestId})] [%highlight(%thread)] ${PID:- } %logger{36} %-5level - %msg%n"/> 17 18 <!-- 将日志滚动输出到application.log文件中 --> 19 <appender name="APPLICATION" 20 class="ch.qos.logback.core.rolling.RollingFileAppender"> 21 <!-- 输出文件目的地 --> 22 <file>${LOG_FILE}</file> 23 <encoder> 24 <pattern>${FILE_LOG_PATTERN}</pattern> 25 <charset>utf8</charset> 26 </encoder> 27 <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 --> 28 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 29 <!-- 文件命名格式 --> 30 <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 31 <!-- 文件保留最大天数 --> 32 <maxHistory>7</maxHistory> 33 <!-- 文件大小限制 --> 34 <maxFileSize>50MB</maxFileSize> 35 <!-- 文件总大小 --> 36 <totalSizeCap>500MB</totalSizeCap> 37 </rollingPolicy> 38 </appender> 39 40 <!-- 摘取出WARN级别日志输出到warn.log中 --> 41 <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> 42 <file>${WARN_LOG_FILE}</file> 43 <encoder> 44 <!-- 使用默认的输出格式打印 --> 45 <pattern>${CONSOLE_LOG_PATTERN}</pattern> 46 <charset>utf8</charset> 47 </encoder> 48 <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 --> 49 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 50 <!-- 文件命名格式 --> 51 <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 52 <!-- 文件保留最大天数 --> 53 <maxHistory>7</maxHistory> 54 <!-- 文件大小限制 --> 55 <maxFileSize>50MB</maxFileSize> 56 <!-- 文件总大小 --> 57 <totalSizeCap>500MB</totalSizeCap> 58 </rollingPolicy> 59 <!-- 日志过滤器,将WARN相关日志过滤出来 --> 60 <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 61 <level>WARN</level> 62 </filter> 63 </appender> 64 65 <!-- 摘取出ERROR级别日志输出到error.log中 --> 66 <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> 67 <file>${ERROR_LOG_FILE}</file> 68 <encoder> 69 <!-- 使用默认的输出格式打印 --> 70 <pattern>${CONSOLE_LOG_PATTERN}</pattern> 71 <charset>utf8</charset> 72 </encoder> 73 <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 --> 74 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 75 <!-- 文件命名格式 --> 76 <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 77 <!-- 文件保留最大天数 --> 78 <maxHistory>7</maxHistory> 79 <!-- 文件大小限制 --> 80 <maxFileSize>50MB</maxFileSize> 81 <!-- 文件总大小 --> 82 <totalSizeCap>500MB</totalSizeCap> 83 </rollingPolicy> 84 <!-- 日志过滤器,将ERROR相关日志过滤出来 --> 85 <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 86 <level>ERROR</level> 87 </filter> 88 </appender> 89 90 <!-- 配置控制台输出 --> 91 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 92 <encoder> 93 <pattern>${FILE_LOG_PATTERN}</pattern> 94 <charset>utf8</charset> 95 </encoder> 96 </appender> 97 98 99 <!-- 配置输出级别 --> 100 <root level="INFO"> 101 <!-- 加入控制台输出 --> 102 <appender-ref ref="CONSOLE"/> 103 <!-- 加入APPLICATION输出 --> 104 <appender-ref ref="APPLICATION"/> 105 <!-- 加入WARN日志输出 --> 106 <appender-ref ref="WARN"/> 107 <!-- 加入ERROR日志输出 --> 108 <appender-ref ref="ERROR"/> 109 </root> 110</configuration>
5. 创建启动类
1package com.summo.sbmy; 2 3import org.springframework.boot.SpringApplication; 4import org.springframework.boot.autoconfigure.SpringBootApplication; 5import org.springframework.scheduling.annotation.EnableScheduling; 6 7/** 8 * @author summo 9 * @version Application.java, 1.0.0 10 * @description 启动核心类 11 * @date 2024年08月09 12 */ 13@SpringBootApplication(scanBasePackages = {"com.summo.sbmy"}) 14@EnableScheduling 15public class Application { 16 17 public static void main(String[] args) { 18 SpringApplication.run(Application.class, args); 19 } 20 21} 22
点击启动,打印如下就算成功

三、实现抖音热搜爬虫
第一次写爬虫代码,我们找一个最简单,也是最安全的例子,抖音热搜。

1. 爬虫方案评估
为什么简单?
它就一个接口:https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/,免登录也不需要参数,你们直接在浏览器上调用就可以把抖音的热搜数据获取到了;
为什么安全?
调用https://www.iesdouyin.com/robots.txt接口,返回如下:
1User-agent: * 2Allow: / 3 4Sitemap: http://www.iesdouyin.com/sitemap/index.xml
这个代表什么呢?

看到了吗,人家不仅允许你去爬,还提供了网站地图的链接,这也是他们为了提高谷歌、必应、百度等浏览器的收录的一种办法。所以,不用担心爬这些数据会怎么样了。
2. 获取链接的cURL代码
先上一张图,如下:

大概的步骤如下:
- 输入https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/链接,按下enter;
- 打开控制台,选择【全部】找到刚才调用的接口;
- 选中接口,右键打开菜单,选择复制里面的“以cURL格式复制”这一项。
复制出来是这样的东西
1curl 'https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/' \ 2 -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ 3 -H 'accept-language: zh-CN,zh;q=0.9' \ 4 -H 'cache-control: no-cache' \ 5 -H 'cookie: ttwid=1%7CJ6ehEognyMAob_gD6oZwA40monN8E_sENr3IUZmuk7o%7C1712472728%7C44b0cd0003fb75861789d62e56f014eaea3d198898a0ae9a947bf61d95d8ac1a; __ac_signature=_02B4Z6wo00f01fFoqvgAAIDBFmj97SX8qiXxSK5AABr708; __ac_referer=https://pre-dc-console.alibaba-inc.com/' \ 6 -H 'pragma: no-cache' \ 7 -H 'priority: u=0, i' \ 8 -H 'sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"' \ 9 -H 'sec-ch-ua-mobile: ?0' \ 10 -H 'sec-ch-ua-platform: "macOS"' \ 11 -H 'sec-fetch-dest: document' \ 12 -H 'sec-fetch-mode: navigate' \ 13 -H 'sec-fetch-site: none' \ 14 -H 'sec-fetch-user: ?1' \ 15 -H 'upgrade-insecure-requests: 1' \ 16 -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
能看懂吗?能看懂最好,看不懂也没有关系,不是给我们看的,给Postman看的。Postman是一个http接口调用工具非常好用,电脑上没有Postman的同学就去下载一个。
3. 使用Postman生成调用代码
打开你的Postman软件,按照我下面这张图操作:

按照我上面的步骤,将cURL命令导入Postman,可以快速生成一个调用请求,如下图:

这个方式也可以用在我们平时调试接口,比如说有一个接口报错了,需要不断地叫前端重试一下,再重试一下,非常麻烦。这个时候你就可以叫前端把这个cURL复制给你,自己动手重试,就不用麻烦别人啦。

在Postman的右上角有一个Code snippet,可以直接生成你想要的调用代码,啥Java、Python、NodeJs都有,不用自己写,复制就可以运行。咋样,Postman没有白骗你下载吧!

代码如下
1OkHttpClient client = new OkHttpClient().newBuilder() 2 .build(); 3Request request = new Request.Builder() 4 .url("https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/") 5 .method("GET", null) 6 .addHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7") 7 .addHeader("accept-language", "zh-CN,zh;q=0.9") 8 .addHeader("cache-control", "no-cache") 9 .addHeader("cookie", "ttwid=1%7CJ6ehEognyMAob_gD6oZwA40monN8E_sENr3IUZmuk7o%7C1712472728%7C44b0cd0003fb75861789d62e56f014eaea3d198898a0ae9a947bf61d95d8ac1a; __ac_signature=_02B4Z6wo00f01fFoqvgAAIDBFmj97SX8qiXxSK5AABr708; __ac_referer=https://pre-dc-console.alibaba-inc.com/; ttwid=1%7CX9ppA_NoTHJI9DG3JN7wNnZ662r-aJbZwCFPLLGK-og%7C1713836331%7Cdbc79a439d0ecc994f60043d66b4ad3ff81c3820f3ab83ef85d30875cc59a18b") 10 .addHeader("pragma", "no-cache") 11 .addHeader("priority", "u=0, i") 12 .addHeader("sec-ch-ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"") 13 .addHeader("sec-ch-ua-mobile", "?0") 14 .addHeader("sec-ch-ua-platform", "\"macOS\"") 15 .addHeader("sec-fetch-dest", "document") 16 .addHeader("sec-fetch-mode", "navigate") 17 .addHeader("sec-fetch-site", "none") 18 .addHeader("sec-fetch-user", "?1") 19 .addHeader("upgrade-insecure-requests", "1") 20 .addHeader("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36") 21 .build(); 22Response response = client.newCall(request).execute();
4. 将代码迁移到应用中
在summo-sbmy-job这个module下,创建一个文件夹com.summo.sbmy.job.douyin,创建DouyinHotSearchJob.java,代码如下
1package com.summo.sbmy.job.douyin; 2 3import java.io.IOException; 4 5import com.alibaba.fastjson.JSONObject; 6 7import okhttp3.OkHttpClient; 8import okhttp3.Request; 9import okhttp3.Response; 10import org.springframework.scheduling.annotation.Scheduled; 11import org.springframework.stereotype.Component; 12 13/** 14 * @author summo 15 * @version DouyinHotSearchJob.java, 1.0.0 16 * @description 抖音热搜Java爬虫代码 17 * @date 2024年08月09 18 */ 19@Component 20public class DouyinHotSearchJob { 21 22 /** 23 * 定时触发爬虫方法,1个小时执行一次 24 */ 25 @Scheduled(fixedRate = 1000 * 60 * 60) 26 public void hotSearch() throws IOException { 27 OkHttpClient client = new OkHttpClient().newBuilder() 28 .build(); 29 Request request = new Request.Builder() 30 .url("https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/") 31 .method("GET", null) 32 .addHeader("accept", 33 "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;" 34 + "q=0.8,application/signed-exchange;v=b3;q=0.7") 35 .addHeader("accept-language", "zh-CN,zh;q=0.9") 36 .addHeader("cache-control", "no-cache") 37 .addHeader("cookie", 38 "ttwid=1%7CJ6ehEognyMAob_gD6oZwA40monN8E_sENr3IUZmuk7o%7C1712472728" 39 + "%7C44b0cd0003fb75861789d62e56f014eaea3d198898a0ae9a947bf61d95d8ac1a; " 40 + "__ac_signature=_02B4Z6wo00f01fFoqvgAAIDBFmj97SX8qiXxSK5AABr708; " 41 + "__ac_referer=https://pre-dc-console.alibaba-inc.com/; " 42 + "ttwid=1%7CX9ppA_NoTHJI9DG3JN7wNnZ662r-aJbZwCFPLLGK-og%7C1713836331" 43 + "%7Cdbc79a439d0ecc994f60043d66b4ad3ff81c3820f3ab83ef85d30875cc59a18b") 44 .addHeader("pragma", "no-cache") 45 .addHeader("priority", "u=0, i") 46 .addHeader("sec-ch-ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"") 47 .addHeader("sec-ch-ua-mobile", "?0") 48 .addHeader("sec-ch-ua-platform", "\"macOS\"") 49 .addHeader("sec-fetch-dest", "document") 50 .addHeader("sec-fetch-mode", "navigate") 51 .addHeader("sec-fetch-site", "none") 52 .addHeader("sec-fetch-user", "?1") 53 .addHeader("upgrade-insecure-requests", "1") 54 .addHeader("user-agent", 55 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) " 56 + "Chrome/126.0.0.0 Safari/537.36") 57 .build(); 58 Response response = client.newCall(request).execute(); 59 System.out.println(JSONObject.toJSONString(response.body().string())); 60 } 61 62}
这个爬虫代码会在启动的时候执行一次,然后每一小时执行一次。这样,我们的第一个定时爬虫就做好了。如果以上的内容你都看不懂,那就直接复制我这代码吧,鱼和渔都给你了。
四、小结一下
这一篇配置文件很多,篇幅很长,大家要耐心和细心一些,不然很容易出错。这里给出的配置是按照最终版给的,到时开发的时候不用担心少依赖或者少包,至于原理和选型后面再单独说吧。我觉得看一个Java程序员经验丰不丰富从他搭建的脚手架就可以看出来,因为脚手架不像代码一样有标准,它是由框架和插件构成的,适合你就用,没有什么是必须的。
还有就是爬虫,可能有些同学会失望,这玩意咋这么简单,一点技术含量都没有。简单的原因一是热搜接口都是免登无校验的,二是因为我已经给你们趟了一条路出来,饭喂到嘴里了。后面还有很多热搜爬虫,有些也挺麻烦的,不用急,我会慢慢公布。
大多数同学大多数时间都只是在干CRUD的活,也没有独立建站的经验,虽然没有但是可以学!现在不会练练就会!100块钱的实操经验绝对比100块钱买的专栏更有意义更有用!
最后,自建摸鱼网站,各大网站热搜一览,上班和摸鱼很配哦!
