《花100块做个摸鱼小网站! 》第二篇—后端应用搭建和完成第一个爬虫

news2024/11/26 20:51:03

一、前言

大家好呀,我是summo,前面已经教会大家怎么去阿里云买服务器(链接在这,需要自取:https://developer.aliyun.com/huodong/dashiblogger?userCode=mtbtcjr1),以及怎么搭建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内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.summo</groupId>
    <artifactId>summo-sbmy</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>summo-sbmy-dao</module>
        <module>summo-sbmy-service</module>
        <module>summo-sbmy-web</module>
        <module>summo-sbmy-start</module>
        <module>summo-sbmy-job</module>
        <module>summo-sbmy-common</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>

            <!-- 自依赖 -->
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-common</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-service</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-common</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-dao</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-job</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-start</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.summo</groupId>
                <artifactId>summo-sbmy-web</artifactId>
                <version>${project.version}</version>
            </dependency>

            <!-- xxl-job -->
            <dependency>
                <groupId>com.xuxueli</groupId>
                <artifactId>xxl-job-core</artifactId>
                <version>2.2.0</version>
            </dependency>

            <!-- MySQL驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.20</version>
            </dependency>

            <!-- mybatis-plus驱动 -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.3.2</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-extension</artifactId>
                <version>3.3.2</version>
            </dependency>

            <!-- 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.4.1</version>
            </dependency>

            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.22</version>
            </dependency>

            <!-- druid链接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.22</version>
            </dependency>

            <!-- aspectj -->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.5</version>
            </dependency>

            <!-- fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>2.0.21</version>
            </dependency>

            <!-- 线程上下文 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>transmittable-thread-local</artifactId>
                <version>2.11.1</version>
            </dependency>

            <!-- 接口参数校验 -->
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
                <version>2.0.1.Final</version>
            </dependency>

            <!-- Redisson分布式锁 -->
            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson-spring-boot-starter</artifactId>
                <version>3.24.0</version>
            </dependency>

            <!-- 通用工具类 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-collections4</artifactId>
                <version>4.1</version>
            </dependency>

            <!-- VM 模板 -->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>velocity-spring-boot-starter</artifactId>
                <version>1.0.4.RELEASE</version>
            </dependency>

            <!-- guava -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>32.1.1-jre</version>
            </dependency>

            <!-- httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
                <version>4.4.16</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.14</version>
            </dependency>

            <!-- jsoup -->
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.12.1</version>
            </dependency>

            <!-- ip2region  -->
            <dependency>
                <groupId>org.lionsoul</groupId>
                <artifactId>ip2region</artifactId>
                <version>2.6.3</version>
            </dependency>

            <!-- 用于读取ip2region.xdb文件使用 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>

            <!-- 加解密代码-->
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk15on</artifactId>
                <version>1.68</version>
            </dependency>
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.15</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <finalName>${project.build.finalName}</finalName>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

(2)summo-sbmy-start

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>summo-sbmy</artifactId>
        <groupId>com.summo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>summo-sbmy-start</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-service</artifactId>
        </dependency>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-job</artifactId>
        </dependency>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-dao</artifactId>
        </dependency>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-web</artifactId>
        </dependency>

        <!-- 测试组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 添加四个环境的变量,变量名为environment -->
    <profiles>
        <profile>
            <id>test</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <environment>test</environment>
            </properties>
        </profile>
        <profile>
            <id>consumer</id>
            <properties>
                <environment>consumer</environment>
            </properties>
        </profile>
        <profile>
            <id>producer</id>
            <properties>
                <environment>producer</environment>
            </properties>
        </profile>
    </profiles>

    <build>
        <finalName>summo-sbmy</finalName>
        <resources>
            <resource>
                <!-- 指定配置文件所在的resource目录 -->
                <directory>src/main/resources</directory>
                <includes>
                    <include>application.properties</include>
                    <include>logback-spring.xml</include>
                    <include>**/*.html</include>
                    <include>**/*.js</include>
                    <include>**/*.css</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <!-- 指定配置文件所在的resource目录 -->
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.woff</include>
                    <include>**/*.ttf</include>
                    <include>**/*.xdb</include>
                    <include>**/*.jks</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.13.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>com.summo.sbmy.Application</mainClass>
                </configuration>
            </plugin>
            <!-- 解压fat jar到target/${project-name}目录 -->
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <configuration>
                            <target>
                                <unzip
                                        src="${project.build.directory}/${project.build.finalName}.${project.packaging}"
                                        dest="${project.build.directory}/summo-sbmy"/>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

(3)summo-sbmy-common

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>summo-sbmy</artifactId>
        <groupId>com.summo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>summo-sbmy-common</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- SpringBoot框架 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- aspectj -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>

        <!-- logback核心组件 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>

        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <!-- 线程上下文 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>transmittable-thread-local</artifactId>
        </dependency>
        <!-- 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.1</version>
        </dependency>
        <!-- 接口参数校验 -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
        </dependency>
        <!-- Redis框架 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- Redisson分布式锁 -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
        </dependency>

        <!-- jedisÏ分布式锁 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!-- 通用工具类 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
        </dependency>

        <!-- guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <!-- httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
        </dependency>

        <!-- ip2region  -->
        <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
        </dependency>

        <!-- 用于读取ip2region.xdb文件使用 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>

        <!-- 加解密代码 -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>

    </dependencies>
</project>

(4)summo-sbmy-dao

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>summo-sbmy</artifactId>
        <groupId>com.summo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>summo-sbmy-dao</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-common</artifactId>
        </dependency>
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- mybatis-plus驱动 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
        </dependency>

        <!-- druid链接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfiguration.xml
                    </configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.2</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

(5)summo-sbmy-service

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>summo-sbmy</artifactId>
        <groupId>com.summo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>summo-sbmy-service</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-dao</artifactId>
        </dependency>
    </dependencies>
</project>

(7)summo-sbmy-web

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>summo-sbmy</artifactId>
        <groupId>com.summo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>summo-sbmy-web</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.summo</groupId>
            <artifactId>summo-sbmy-service</artifactId>
        </dependency>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>
</project>

pom.xml配置贴好后,更新一下,把依赖包都下载下来。如果你发现下载的非常慢,把maven仓库的镜像换一下,换成阿里云的。镜像配置如下:

<mirrors>
  <mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public</url>
  </mirror>
</mirrors>

3. application.properties配置

## 应用名
spring.application.name=summo-sbmy
## 端口号
server.port=8080

# 配置Druid数据源类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 数据库连接URL,包括数据库名、允许的公开密钥检索、字符编码、禁用SSL、时区设置等
spring.datasource.url=jdbc:mysql://xxx:3306/summo-sbmy?allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull
# 数据库用户名
spring.datasource.username=xxx
# 数据库密码
spring.datasource.password=xxx
# 数据库驱动类名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 初始化连接池时创建的连接数量
spring.datasource.druid.initial-size=5
# 连接池最大活跃连接数
spring.datasource.druid.max-active=30
# 连接池最小空闲连接数
spring.datasource.druid.min-idle=5
# 等待连接获取的最大等待时间
spring.datasource.druid.max-wait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一个连接在池中最小生存的时间
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 验证数据库连接有效的SQL语句
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
# 是否在从连接池获取连接前进行检验(建议关闭,影响性能)
spring.datasource.druid.test-while-idle=true
# 获取连接时执行validationQuery检测连接是否有效(建议关闭,影响性能)
spring.datasource.druid.test-on-borrow=false
# 归还连接时执行validationQuery检测连接是否有效(建议关闭,影响性能)
spring.datasource.druid.test-on-return=false
# 是否开启PSCache(PreparedStatement缓存),默认false
spring.datasource.druid.pool-prepared-statements=false
# 指定每个连接上PSCache的大小,默认-1表示不限制
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=0
# 启用监控统计和日志过滤器
spring.datasource.druid.filters=stat,wall
# 配置StatFilter的参数,合并SQL记录
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# 是否合并Druid数据源的监控信息
spring.datasource.druid.use-global-data-source-stat=true
# 开启Wall过滤器,并指定数据库类型为MySQL
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=mysql
# 配置StatFilter的数据库类型为MySQL
spring.datasource.druid.filter.stat.db-type=mysql
# 开启StatFilter
spring.datasource.druid.filter.stat.enabled=true

# MyBatis配置:自动映射行为设置为全字段
mybatis.configuration.auto-mapping-behavior=full
# MyBatis配置:下划线转驼峰命名规则
mybatis.configuration.map-underscore-to-camel-case=true
# MyBatis-Plus的Mapper文件位置
mybatis-plus.mapper-locations=classpath*:/mybatis/mapper/*.xml

# Redis数据库索引
spring.redis.database=0
# Redis连接超时时间(毫秒)
spring.redis.timeout=1800000
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器端口
spring.redis.port=6379
# Redis服务器连接密码
spring.redis.password=xxx
# 使用Lettuce连接池时的最大等待时间(-1表示无限制)
spring.redis.lettuce.pool.max-wait=-1
# Lettuce连接池的最大空闲连接数
spring.redis.lettuce.pool.max-idle=5
# Lettuce连接池的最小空闲连接数
spring.redis.lettuce.pool.min-idle=0
# Lettuce连接池的最大活跃连接数
spring.redis.lettuce.pool.max-active=20
# 使用Jedis连接池时的最小空闲连接数
spring.redis.jedis.pool.min-idle=8
# Jedis连接池的最大空闲连接数
spring.redis.jedis.pool.max-idle=500
# Jedis连接池的最大活跃连接数
spring.redis.jedis.pool.max-active=2000
# Jedis连接池的最大等待时间(毫秒)
spring.redis.jedis.pool.max-wait=10000

4. logback-spring.xml配置

<configuration>
    <!-- 默认的一些配置 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定义应用名称,区分应用 -->
    <property name="APP_NAME" value="summo-sbmy"/>
    <!-- 定义日志文件的输出路径 -->
    <property name="LOG_PATH" value="${user.home}/logs/${APP_NAME}"/>
    <!-- 定义日志文件名称和路径 -->
    <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
    <!-- 定义警告级别日志文件名称和路径 -->
    <property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/>
    <!-- 定义错误级别日志文件名称和路径 -->
    <property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/>

    <!-- 自定义控制台打印格式 -->
    <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"/>

    <!-- 将日志滚动输出到application.log文件中 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 输出文件目的地 -->
        <file>${LOG_FILE}</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件命名格式 -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 文件保留最大天数 -->
            <maxHistory>7</maxHistory>
            <!-- 文件大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 文件总大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 摘取出WARN级别日志输出到warn.log中 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_FILE}</file>
        <encoder>
            <!-- 使用默认的输出格式打印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件命名格式 -->
            <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 文件保留最大天数 -->
            <maxHistory>7</maxHistory>
            <!-- 文件大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 文件总大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 日志过滤器,将WARN相关日志过滤出来 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 摘取出ERROR级别日志输出到error.log中 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_FILE}</file>
        <encoder>
            <!-- 使用默认的输出格式打印 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件命名格式 -->
            <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 文件保留最大天数 -->
            <maxHistory>7</maxHistory>
            <!-- 文件大小限制 -->
            <maxFileSize>50MB</maxFileSize>
            <!-- 文件总大小 -->
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
        <!-- 日志过滤器,将ERROR相关日志过滤出来 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- 配置控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>


    <!-- 配置输出级别 -->
    <root level="INFO">
        <!-- 加入控制台输出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 加入APPLICATION输出 -->
        <appender-ref ref="APPLICATION"/>
        <!-- 加入WARN日志输出 -->
        <appender-ref ref="WARN"/>
        <!-- 加入ERROR日志输出 -->
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

5. 创建启动类

package com.summo.sbmy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * @author summo
 * @version Application.java, 1.0.0
 * @description 启动核心类
 * @date 2024年08月09
 */
@SpringBootApplication(scanBasePackages = {"com.summo.sbmy"})
@EnableScheduling
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

点击启动,打印如下就算成功

三、实现抖音热搜爬虫

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

1. 爬虫方案评估

为什么简单?
它就一个接口:https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/,免登录也不需要参数,你们直接在浏览器上调用就可以把抖音的热搜数据获取到了;

为什么安全?
调用https://www.iesdouyin.com/robots.txt接口,返回如下:

User-agent: *
Allow: /

Sitemap: http://www.iesdouyin.com/sitemap/index.xml

这个代表什么呢?

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

2. 获取链接的cURL代码

先上一张图,如下:

大概的步骤如下:

  1. 输入https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/链接,按下enter;
  2. 打开控制台,选择【全部】找到刚才调用的接口;
  3. 选中接口,右键打开菜单,选择复制里面的“以cURL格式复制”这一项。

复制出来是这样的东西

curl 'https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/' \
  -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' \
  -H 'accept-language: zh-CN,zh;q=0.9' \
  -H 'cache-control: no-cache' \
  -H 'cookie: ttwid=1%7CJ6ehEognyMAob_gD6oZwA40monN8E_sENr3IUZmuk7o%7C1712472728%7C44b0cd0003fb75861789d62e56f014eaea3d198898a0ae9a947bf61d95d8ac1a; __ac_signature=_02B4Z6wo00f01fFoqvgAAIDBFmj97SX8qiXxSK5AABr708; __ac_referer=https://pre-dc-console.alibaba-inc.com/' \
  -H 'pragma: no-cache' \
  -H 'priority: u=0, i' \
  -H 'sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  -H 'sec-fetch-dest: document' \
  -H 'sec-fetch-mode: navigate' \
  -H 'sec-fetch-site: none' \
  -H 'sec-fetch-user: ?1' \
  -H 'upgrade-insecure-requests: 1' \
  -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没有白骗你下载吧!

代码如下

OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/")
  .method("GET", null)
  .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")
  .addHeader("accept-language", "zh-CN,zh;q=0.9")
  .addHeader("cache-control", "no-cache")
  .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")
  .addHeader("pragma", "no-cache")
  .addHeader("priority", "u=0, i")
  .addHeader("sec-ch-ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"")
  .addHeader("sec-ch-ua-mobile", "?0")
  .addHeader("sec-ch-ua-platform", "\"macOS\"")
  .addHeader("sec-fetch-dest", "document")
  .addHeader("sec-fetch-mode", "navigate")
  .addHeader("sec-fetch-site", "none")
  .addHeader("sec-fetch-user", "?1")
  .addHeader("upgrade-insecure-requests", "1")
  .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")
  .build();
Response response = client.newCall(request).execute();

4. 将代码迁移到应用中

summo-sbmy-job这个module下,创建一个文件夹com.summo.sbmy.job.douyin,创建DouyinHotSearchJob.java,代码如下

package com.summo.sbmy.job.douyin;

import java.io.IOException;

import com.alibaba.fastjson.JSONObject;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author summo
 * @version DouyinHotSearchJob.java, 1.0.0
 * @description 抖音热搜Java爬虫代码
 * @date 2024年08月09
 */
@Component
public class DouyinHotSearchJob {

    /**
     * 定时触发爬虫方法,1个小时执行一次
     */
    @Scheduled(fixedRate = 1000 * 60 * 60)
    public void hotSearch() throws IOException {
        OkHttpClient client = new OkHttpClient().newBuilder()
            .build();
        Request request = new Request.Builder()
            .url("https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/")
            .method("GET", null)
            .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")
            .addHeader("accept-language", "zh-CN,zh;q=0.9")
            .addHeader("cache-control", "no-cache")
            .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")
            .addHeader("pragma", "no-cache")
            .addHeader("priority", "u=0, i")
            .addHeader("sec-ch-ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"")
            .addHeader("sec-ch-ua-mobile", "?0")
            .addHeader("sec-ch-ua-platform", "\"macOS\"")
            .addHeader("sec-fetch-dest", "document")
            .addHeader("sec-fetch-mode", "navigate")
            .addHeader("sec-fetch-site", "none")
            .addHeader("sec-fetch-user", "?1")
            .addHeader("upgrade-insecure-requests", "1")
            .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")
            .build();
        Response response = client.newCall(request).execute();
        System.out.println(JSONObject.toJSONString(response.body().string()));
    }

}

这个爬虫代码会在启动的时候执行一次,然后每一小时执行一次。这样,我们的第一个定时爬虫就做好了。如果以上的内容你都看不懂,那就直接复制我这代码吧,鱼和渔都给你了。

四、小结一下

这一篇配置文件很多,篇幅很长,大家要耐心和细心一些,不然很容易出错。这里给出的配置是按照最终版给的,到时开发的时候不用担心少依赖或者少包,至于原理和选型后面再单独说吧。我觉得看一个Java程序员经验丰不丰富从他搭建的脚手架就可以看出来,因为脚手架不像代码一样有标准,它是由框架和插件构成的,适合你就用,没有什么是必须的。

还有就是爬虫,可能有些同学会失望,这玩意咋这么简单,一点技术含量都没有。简单的原因一是热搜接口都是免登无校验的,二是因为我已经给你们趟了一条路出来,饭喂到嘴里了。后面还有很多热搜爬虫,有些也挺麻烦的,不用急,我会慢慢公布。
大多数同学大多数时间都只是在干CRUD的活,也没有独立建站的经验,虽然没有但是可以学!现在不会练练就会!100块钱的实操经验绝对比100块钱买的专栏更有意义更有用!

最后,自建摸鱼网站,各大网站热搜一览,上班和摸鱼很配哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R 语言学习教程,从入门到精通,R 数据类型(6)

1、R 数据类型 数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。 变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 R 语言中的最基本数据类型主要有三种&#xff1a; 数字 逻辑 文本 数字常量主要有两种&#xff1a; 逻辑类型在许多…

vscode配置xdebug断点调试详细教程

注&#xff1a;环境为本地windows开发环境&#xff0c;编辑器为vscode&#xff0c;PHP集成环境工具为EServer vscode安装扩展并配置 安装PHP Debug 扩展中搜索 PHP Debug 并安装&#xff1a; 配置PHP Debug 1、点击扩展设置 2、在设置中&#xff0c;点击 setting.json 3、编…

【C++】从零实现一个高并发内存池

目录 项目简介 技术栈 内存池 内存池解决的主要问题 效率问题 内存碎片问题 整体框架设计 Thread Cache 代码框架 Central Cache 代码框架 Page Cache 代码框架 申请内存流程 Thread Cache Central Cache Page Cache 释放内存流程 Thread Cache Central Cac…

P4213 【模板】杜教筛、P3768 简单的数学题、P3803 【模板】多项式乘法(FFT)

P4213 【模板】杜教筛 题目描述 P4213 【模板】杜教筛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 运行代码 #include <iostream> #include <map>using namespace std;const int N 2000010; long long vis[N], pm[N], mu[N], phi[N], cnt; map<long lon…

解决手机按键失灵!全新检测方案了解一下!

手机按键在手机设备中起着至关重要的作用&#xff0c;手机按键用于执行各种操作&#xff0c;如接听电话、挂断电话、调节音量、开关机等&#xff0c;方便用户进行基本操作。在生产过程中视觉检测需要确保按键的尺寸、形状和表面光滑度符合设计要求&#xff0c;以保证按键的正常…

寒武纪提出视觉AI新高度:不再依赖LLM, Cambrian-1模型让世界看见多模态的力量!

论文标题: Cambrian-1: A Fully Open, Vision-Centric Exploration of Multimodal LLMs 作者团队&#xff1a;纽约大学谢赛宁, Yann LeCun等人 导读&#xff1a; 寒武纪1号(Cambrian-1)&#xff0c;一种以视觉为核心设计的多模态大语言模型&#xff08;MLLMs&#xff09;&…

技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定

作者&#xff1a;Rachel Kang 排版&#xff1a;Alan Wang 在当今的应用开发领域&#xff0c;通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件&#xff0c;甚至允许无缝创建跨平台自定义控件。然而&a…

【星闪开发连载】WS63E开发板Windows环境的构建

目录 HiSpark Studio安装 Python环境配置 SDK代码下载 新建工程 海思官方在gitee仓库中提供了一个文档介绍fbb_ws63: fbb_ws63代码仓为支持ws63和ws63e解决方案SDK。技术论坛&#xff1a;https://developer.hisilicon.com/forum/0133146886267870001 - Gitee.comhttps://gi…

WPF 数据模板DataTemplate、控件模板ControlTemplate、Style、ItemsPreseter

一言蔽之&#xff0c;Template就是“外衣”—— ControlTemplate是控件的外衣&#xff0c; DataTemplate是数据的外衣。 DataTemplate 它定义了一个数据对象的可视化结构 DataTemplate常用的地方有3处&#xff0c;分别是&#xff1a; ContentControl的ContentTemplate属性&…

提升体验:UI设计的可用性原则

在中国&#xff0c;每年都有数十万设计专业毕业生涌入市场&#xff0c;但只有少数能够进入顶尖企业。尽管如此&#xff0c;所有设计师都怀揣着成长和提升的愿望。在评价产品的用户体验时&#xff0c;我们可能会依赖直觉来决定设计方案&#xff0c;或者在寻找改善产品体验的切入…

八股总结----计算机网络

0.OSI七层模型 自己的理解&#xff1a;应用层&#xff1a;生成HTTP请求报文-----表示层&#xff1a;将请求报文转换成适合网络传输的数据格式&#xff0c;加密压缩编码等-----会话层&#xff1a;管理两个应用程序之间的会话&#xff0c;包括连接中断等------传输层&#xff1a…

HAProxy 效能飞跃先锋队

目录 一 负载均衡 1.1 四层负载 1.2 七层负载 1.3 四层负载和七层负载的区别 二 Haproxy简介 2.1 概念和内容 2.2 haproxy的基本配置信息 2.2.1 global 配置 2.2.2 proxies 配置 三 Haproxy的算法 3.1 静态算法 3.2 动态算法 3.3 其他算法 四 高级功能及配置 4.…

进程编程及其函数的使用

1. 创建进程 创建进程的核心操作是使用 fork() 系统调用。 1.1 fork() 系统调用 fork() 创建一个新进程&#xff08;子进程&#xff09;&#xff0c;新进程几乎是父进程的完整拷贝。fork() 返回两次&#xff1a; 在父进程中&#xff0c;返回子进程的 PID。在子进程中&#…

Typescript在AI产品中应用越来越广泛

AI产品中的应用 TypeScript 在 AI 产品中的应用逐渐增多&#xff0c;主要得益于其提供的类型安全、面向对象编程和模块化等特性&#xff0c;这些特性使得开发者能够构建可维护、可扩展和高性能的应用程序。 首先&#xff0c;TypeScript 作为 JavaScript 的超集&#xff0c;通…

C++类和对象(2)——取地址运算符重载

一、const成员函数 const放在成员函数参数列表后面进行修饰&#xff0c;那么这个成员函数就是const成员函数&#xff1b;const实际修饰的是成员函数形参中包含的this指针的形参&#xff0c;表明在这个成员函数内部不能对成员进行修改。 例如日期类里面的Print成员函数&#x…

【HarmonyOS NEXT星河版开发学习】综合测试案例-拼夕夕首页

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 该实战案例并没有用到太多的知识点&#xff0c;只不过用到的一些新东西&#xff0c;要多花时间去熟悉手机app的一些页面&#xff0c;对…

【Python】Python单元测试基础

文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 01-单元测试基础 什么是单元测试常用的文件结构编写第一个单元测试运行单元测试 什么是单元测试 单元测试是指一个自动化的测试&#xff1a; 用来验证一小段代码&#xff08;单元&#xff09;的正确性&#…

【LLM】医疗大语言模型:CareGPT

向AI转型的程序员都关注公众号 机器学习AI算法工程 CareGPT (关怀GPT)是一个医疗大语言模型&#xff0c;同时它集合了数十个公开可用的医疗微调数据集和开放可用的医疗大语言模型&#xff0c;包含LLM的训练、测评、部署等以促进医疗LLM快速发展。 特性&#xff1a; 添加ChatG…

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读 开源大模型文件预览 Baseline 1.导入库 # 导入所需的库 from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st2.模型下载 # 源大模型下载 from modelscope…

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗&#xff1f;就是那种拥有一个属于自己的影音库&#xff0c;不用担心被和谐&#xff0c;随时可以登录访问电脑上的各种文件&#xff0c;相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘&#xff0c;可以实现…