经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
《花100块做个摸鱼小网站! 》第二篇—后端应用搭建和完成第一个爬虫
来源:cnblogs  作者:sum墨  时间:2024/8/19 15:51:53  对本文有异议

一、前言

大家好呀,我是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内容如下:

点击展开代码
  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. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.7.15</version>
  10. <relativePath/> <!-- lookup parent from repository -->
  11. </parent>
  12. <groupId>com.summo</groupId>
  13. <artifactId>summo-sbmy</artifactId>
  14. <packaging>pom</packaging>
  15. <version>1.0-SNAPSHOT</version>
  16. <modules>
  17. <module>summo-sbmy-dao</module>
  18. <module>summo-sbmy-service</module>
  19. <module>summo-sbmy-web</module>
  20. <module>summo-sbmy-start</module>
  21. <module>summo-sbmy-job</module>
  22. <module>summo-sbmy-common</module>
  23. </modules>
  24. <properties>
  25. <maven.compiler.source>8</maven.compiler.source>
  26. <maven.compiler.target>8</maven.compiler.target>
  27. </properties>
  28. <dependencyManagement>
  29. <dependencies>
  30. <!-- 自依赖 -->
  31. <dependency>
  32. <groupId>com.summo</groupId>
  33. <artifactId>summo-sbmy-common</artifactId>
  34. <version>${project.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>com.summo</groupId>
  38. <artifactId>summo-sbmy-service</artifactId>
  39. <version>${project.version}</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>com.summo</groupId>
  43. <artifactId>summo-sbmy-common</artifactId>
  44. <version>${project.version}</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>com.summo</groupId>
  48. <artifactId>summo-sbmy-dao</artifactId>
  49. <version>${project.version}</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>com.summo</groupId>
  53. <artifactId>summo-sbmy-job</artifactId>
  54. <version>${project.version}</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>com.summo</groupId>
  58. <artifactId>summo-sbmy-start</artifactId>
  59. <version>${project.version}</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>com.summo</groupId>
  63. <artifactId>summo-sbmy-web</artifactId>
  64. <version>${project.version}</version>
  65. </dependency>
  66. <!-- xxl-job -->
  67. <dependency>
  68. <groupId>com.xuxueli</groupId>
  69. <artifactId>xxl-job-core</artifactId>
  70. <version>2.2.0</version>
  71. </dependency>
  72. <!-- MySQL驱动 -->
  73. <dependency>
  74. <groupId>mysql</groupId>
  75. <artifactId>mysql-connector-java</artifactId>
  76. <version>8.0.20</version>
  77. </dependency>
  78. <!-- mybatis-plus驱动 -->
  79. <dependency>
  80. <groupId>com.baomidou</groupId>
  81. <artifactId>mybatis-plus-boot-starter</artifactId>
  82. <version>3.3.2</version>
  83. </dependency>
  84. <dependency>
  85. <groupId>com.baomidou</groupId>
  86. <artifactId>mybatis-plus-extension</artifactId>
  87. <version>3.3.2</version>
  88. </dependency>
  89. <!-- 分页插件 -->
  90. <dependency>
  91. <groupId>com.github.pagehelper</groupId>
  92. <artifactId>pagehelper-spring-boot-starter</artifactId>
  93. <version>1.4.1</version>
  94. </dependency>
  95. <!-- lombok -->
  96. <dependency>
  97. <groupId>org.projectlombok</groupId>
  98. <artifactId>lombok</artifactId>
  99. <version>1.16.22</version>
  100. </dependency>
  101. <!-- druid链接池 -->
  102. <dependency>
  103. <groupId>com.alibaba</groupId>
  104. <artifactId>druid-spring-boot-starter</artifactId>
  105. <version>1.1.22</version>
  106. </dependency>
  107. <!-- aspectj -->
  108. <dependency>
  109. <groupId>org.aspectj</groupId>
  110. <artifactId>aspectjweaver</artifactId>
  111. <version>1.9.5</version>
  112. </dependency>
  113. <!-- fastjson -->
  114. <dependency>
  115. <groupId>com.alibaba</groupId>
  116. <artifactId>fastjson</artifactId>
  117. <version>2.0.21</version>
  118. </dependency>
  119. <!-- 线程上下文 -->
  120. <dependency>
  121. <groupId>com.alibaba</groupId>
  122. <artifactId>transmittable-thread-local</artifactId>
  123. <version>2.11.1</version>
  124. </dependency>
  125. <!-- 接口参数校验 -->
  126. <dependency>
  127. <groupId>javax.validation</groupId>
  128. <artifactId>validation-api</artifactId>
  129. <version>2.0.1.Final</version>
  130. </dependency>
  131. <!-- Redisson分布式锁 -->
  132. <dependency>
  133. <groupId>org.redisson</groupId>
  134. <artifactId>redisson-spring-boot-starter</artifactId>
  135. <version>3.24.0</version>
  136. </dependency>
  137. <!-- 通用工具类 -->
  138. <dependency>
  139. <groupId>org.apache.commons</groupId>
  140. <artifactId>commons-lang3</artifactId>
  141. <version>3.5</version>
  142. </dependency>
  143. <dependency>
  144. <groupId>org.apache.commons</groupId>
  145. <artifactId>commons-collections4</artifactId>
  146. <version>4.1</version>
  147. </dependency>
  148. <!-- VM 模板 -->
  149. <dependency>
  150. <groupId>com.alibaba.boot</groupId>
  151. <artifactId>velocity-spring-boot-starter</artifactId>
  152. <version>1.0.4.RELEASE</version>
  153. </dependency>
  154. <!-- guava -->
  155. <dependency>
  156. <groupId>com.google.guava</groupId>
  157. <artifactId>guava</artifactId>
  158. <version>32.1.1-jre</version>
  159. </dependency>
  160. <!-- httpclient -->
  161. <dependency>
  162. <groupId>org.apache.httpcomponents</groupId>
  163. <artifactId>httpcore</artifactId>
  164. <version>4.4.16</version>
  165. </dependency>
  166. <dependency>
  167. <groupId>org.apache.httpcomponents</groupId>
  168. <artifactId>httpclient</artifactId>
  169. <version>4.5.14</version>
  170. </dependency>
  171. <!-- jsoup -->
  172. <dependency>
  173. <groupId>org.jsoup</groupId>
  174. <artifactId>jsoup</artifactId>
  175. <version>1.12.1</version>
  176. </dependency>
  177. <!-- ip2region -->
  178. <dependency>
  179. <groupId>org.lionsoul</groupId>
  180. <artifactId>ip2region</artifactId>
  181. <version>2.6.3</version>
  182. </dependency>
  183. <!-- 用于读取ip2region.xdb文件使用 -->
  184. <dependency>
  185. <groupId>commons-io</groupId>
  186. <artifactId>commons-io</artifactId>
  187. <version>2.6</version>
  188. </dependency>
  189. <!-- 加解密代码-->
  190. <dependency>
  191. <groupId>org.bouncycastle</groupId>
  192. <artifactId>bcprov-jdk15on</artifactId>
  193. <version>1.68</version>
  194. </dependency>
  195. <dependency>
  196. <groupId>commons-codec</groupId>
  197. <artifactId>commons-codec</artifactId>
  198. <version>1.15</version>
  199. </dependency>
  200. </dependencies>
  201. </dependencyManagement>
  202. <build>
  203. <plugins>
  204. <plugin>
  205. <groupId>org.apache.maven.plugins</groupId>
  206. <artifactId>maven-compiler-plugin</artifactId>
  207. <version>3.8.1</version>
  208. <configuration>
  209. <source>1.8</source>
  210. <target>1.8</target>
  211. <encoding>utf-8</encoding>
  212. </configuration>
  213. </plugin>
  214. <plugin>
  215. <groupId>org.apache.maven.plugins</groupId>
  216. <artifactId>maven-source-plugin</artifactId>
  217. <version>2.2</version>
  218. <executions>
  219. <execution>
  220. <id>attach-sources</id>
  221. <goals>
  222. <goal>jar</goal>
  223. </goals>
  224. </execution>
  225. </executions>
  226. <configuration>
  227. <finalName>${project.build.finalName}</finalName>
  228. </configuration>
  229. </plugin>
  230. </plugins>
  231. </build>
  232. </project>

(2)summo-sbmy-start

pom.xml内容如下:

点击展开代码
  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. <artifactId>summo-sbmy-start</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.summo</groupId>
  19. <artifactId>summo-sbmy-service</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.summo</groupId>
  23. <artifactId>summo-sbmy-job</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.summo</groupId>
  27. <artifactId>summo-sbmy-dao</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>com.summo</groupId>
  31. <artifactId>summo-sbmy-common</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>com.summo</groupId>
  35. <artifactId>summo-sbmy-web</artifactId>
  36. </dependency>
  37. <!-- 测试组件 -->
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>junit</groupId>
  45. <artifactId>junit</artifactId>
  46. <scope>test</scope>
  47. </dependency>
  48. </dependencies>
  49. <!-- 添加四个环境的变量,变量名为environment -->
  50. <profiles>
  51. <profile>
  52. <id>test</id>
  53. <activation>
  54. <activeByDefault>true</activeByDefault>
  55. </activation>
  56. <properties>
  57. <environment>test</environment>
  58. </properties>
  59. </profile>
  60. <profile>
  61. <id>consumer</id>
  62. <properties>
  63. <environment>consumer</environment>
  64. </properties>
  65. </profile>
  66. <profile>
  67. <id>producer</id>
  68. <properties>
  69. <environment>producer</environment>
  70. </properties>
  71. </profile>
  72. </profiles>
  73. <build>
  74. <finalName>summo-sbmy</finalName>
  75. <resources>
  76. <resource>
  77. <!-- 指定配置文件所在的resource目录 -->
  78. <directory>src/main/resources</directory>
  79. <includes>
  80. <include>application.properties</include>
  81. <include>logback-spring.xml</include>
  82. <include>**/*.html</include>
  83. <include>**/*.js</include>
  84. <include>**/*.css</include>
  85. </includes>
  86. <filtering>true</filtering>
  87. </resource>
  88. <resource>
  89. <!-- 指定配置文件所在的resource目录 -->
  90. <directory>src/main/resources</directory>
  91. <includes>
  92. <include>**/*.woff</include>
  93. <include>**/*.ttf</include>
  94. <include>**/*.xdb</include>
  95. <include>**/*.jks</include>
  96. </includes>
  97. <filtering>false</filtering>
  98. </resource>
  99. </resources>
  100. <plugins>
  101. <plugin>
  102. <groupId>org.springframework.boot</groupId>
  103. <artifactId>spring-boot-maven-plugin</artifactId>
  104. <version>2.1.13.RELEASE</version>
  105. <executions>
  106. <execution>
  107. <goals>
  108. <goal>repackage</goal>
  109. </goals>
  110. </execution>
  111. </executions>
  112. <configuration>
  113. <mainClass>com.summo.sbmy.Application</mainClass>
  114. </configuration>
  115. </plugin>
  116. <!-- 解压fat jar到target/${project-name}目录 -->
  117. <plugin>
  118. <artifactId>maven-antrun-plugin</artifactId>
  119. <executions>
  120. <execution>
  121. <phase>package</phase>
  122. <configuration>
  123. <target>
  124. <unzip
  125. src="${project.build.directory}/${project.build.finalName}.${project.packaging}"
  126. dest="${project.build.directory}/summo-sbmy"/>
  127. </target>
  128. </configuration>
  129. <goals>
  130. <goal>run</goal>
  131. </goals>
  132. </execution>
  133. </executions>
  134. </plugin>
  135. </plugins>
  136. </build>
  137. </project>

(3)summo-sbmy-common

pom.xml内容如下:

点击展开代码
  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. <artifactId>summo-sbmy-common</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <!-- SpringBoot框架 -->
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <!-- lombok -->
  23. <dependency>
  24. <groupId>org.projectlombok</groupId>
  25. <artifactId>lombok</artifactId>
  26. </dependency>
  27. <!-- aspectj -->
  28. <dependency>
  29. <groupId>org.aspectj</groupId>
  30. <artifactId>aspectjweaver</artifactId>
  31. <version>1.9.5</version>
  32. </dependency>
  33. <!-- logback核心组件 -->
  34. <dependency>
  35. <groupId>ch.qos.logback</groupId>
  36. <artifactId>logback-core</artifactId>
  37. </dependency>
  38. <!-- fastjson -->
  39. <dependency>
  40. <groupId>com.alibaba</groupId>
  41. <artifactId>fastjson</artifactId>
  42. </dependency>
  43. <!-- 线程上下文 -->
  44. <dependency>
  45. <groupId>com.alibaba</groupId>
  46. <artifactId>transmittable-thread-local</artifactId>
  47. </dependency>
  48. <!-- 分页插件 -->
  49. <dependency>
  50. <groupId>com.github.pagehelper</groupId>
  51. <artifactId>pagehelper-spring-boot-starter</artifactId>
  52. <version>1.4.1</version>
  53. </dependency>
  54. <!-- 接口参数校验 -->
  55. <dependency>
  56. <groupId>javax.validation</groupId>
  57. <artifactId>validation-api</artifactId>
  58. </dependency>
  59. <dependency>
  60. <groupId>com.squareup.okhttp3</groupId>
  61. <artifactId>okhttp</artifactId>
  62. </dependency>
  63. <!-- Redis框架 -->
  64. <dependency>
  65. <groupId>org.springframework.boot</groupId>
  66. <artifactId>spring-boot-starter-data-redis</artifactId>
  67. </dependency>
  68. <!-- Redisson分布式锁 -->
  69. <dependency>
  70. <groupId>org.redisson</groupId>
  71. <artifactId>redisson-spring-boot-starter</artifactId>
  72. </dependency>
  73. <!-- jedis?分布式锁 -->
  74. <dependency>
  75. <groupId>redis.clients</groupId>
  76. <artifactId>jedis</artifactId>
  77. </dependency>
  78. <!-- 通用工具类 -->
  79. <dependency>
  80. <groupId>org.apache.commons</groupId>
  81. <artifactId>commons-lang3</artifactId>
  82. </dependency>
  83. <dependency>
  84. <groupId>org.apache.commons</groupId>
  85. <artifactId>commons-collections4</artifactId>
  86. </dependency>
  87. <!-- guava -->
  88. <dependency>
  89. <groupId>com.google.guava</groupId>
  90. <artifactId>guava</artifactId>
  91. </dependency>
  92. <!-- httpclient -->
  93. <dependency>
  94. <groupId>org.apache.httpcomponents</groupId>
  95. <artifactId>httpcore</artifactId>
  96. </dependency>
  97. <dependency>
  98. <groupId>org.apache.httpcomponents</groupId>
  99. <artifactId>httpclient</artifactId>
  100. </dependency>
  101. <dependency>
  102. <groupId>org.jsoup</groupId>
  103. <artifactId>jsoup</artifactId>
  104. </dependency>
  105. <!-- ip2region -->
  106. <dependency>
  107. <groupId>org.lionsoul</groupId>
  108. <artifactId>ip2region</artifactId>
  109. </dependency>
  110. <!-- 用于读取ip2region.xdb文件使用 -->
  111. <dependency>
  112. <groupId>commons-io</groupId>
  113. <artifactId>commons-io</artifactId>
  114. </dependency>
  115. <!-- 加解密代码 -->
  116. <dependency>
  117. <groupId>org.bouncycastle</groupId>
  118. <artifactId>bcprov-jdk15on</artifactId>
  119. </dependency>
  120. <dependency>
  121. <groupId>commons-codec</groupId>
  122. <artifactId>commons-codec</artifactId>
  123. </dependency>
  124. <dependency>
  125. <groupId>com.google.code.gson</groupId>
  126. <artifactId>gson</artifactId>
  127. <version>2.8.6</version>
  128. </dependency>
  129. </dependencies>
  130. </project>

(4)summo-sbmy-dao

pom.xml内容如下:

点击展开代码
  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. <artifactId>summo-sbmy-dao</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.summo</groupId>
  19. <artifactId>summo-sbmy-common</artifactId>
  20. </dependency>
  21. <!-- MySQL驱动 -->
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. </dependency>
  26. <!-- mybatis-plus驱动 -->
  27. <dependency>
  28. <groupId>com.baomidou</groupId>
  29. <artifactId>mybatis-plus-boot-starter</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>com.baomidou</groupId>
  33. <artifactId>mybatis-plus-extension</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>javax.persistence</groupId>
  37. <artifactId>javax.persistence-api</artifactId>
  38. </dependency>
  39. <!-- druid链接池 -->
  40. <dependency>
  41. <groupId>com.alibaba</groupId>
  42. <artifactId>druid-spring-boot-starter</artifactId>
  43. </dependency>
  44. </dependencies>
  45. <build>
  46. <plugins>
  47. <plugin>
  48. <groupId>org.mybatis.generator</groupId>
  49. <artifactId>mybatis-generator-maven-plugin</artifactId>
  50. <version>1.3.6</version>
  51. <configuration>
  52. <configurationFile>${basedir}/src/main/resources/generator/generatorConfiguration.xml
  53. </configurationFile>
  54. <overwrite>true</overwrite>
  55. <verbose>true</verbose>
  56. </configuration>
  57. <dependencies>
  58. <dependency>
  59. <groupId>tk.mybatis</groupId>
  60. <artifactId>mapper</artifactId>
  61. <version>4.1.2</version>
  62. </dependency>
  63. </dependencies>
  64. </plugin>
  65. </plugins>
  66. </build>
  67. </project>

(5)summo-sbmy-service

pom.xml内容如下:

点击展开代码
  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. <artifactId>summo-sbmy-service</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.summo</groupId>
  19. <artifactId>summo-sbmy-dao</artifactId>
  20. </dependency>
  21. </dependencies>
  22. </project>

(6)summo-sbmy-web

pom.xml内容如下:

点击展开代码
  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. <artifactId>summo-sbmy-web</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.summo</groupId>
  19. <artifactId>summo-sbmy-service</artifactId>
  20. </dependency>
  21. <!-- thymeleaf -->
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  25. </dependency>
  26. </dependencies>
  27. </project>

(7)summo-sbmy-job

pom.xml内容如下:

点击展开代码
  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. <artifactId>summo-sbmy-job</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.summo</groupId>
  19. <artifactId>summo-sbmy-service</artifactId>
  20. </dependency>
  21. </dependencies>
  22. </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. ## 应用名
  2. spring.application.name=summo-sbmy
  3. ## 端口号
  4. server.port=8080
  5. # 配置Druid数据源类型
  6. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  7. # 数据库连接URL,包括数据库名、允许的公开密钥检索、字符编码、禁用SSL、时区设置等
  8. spring.datasource.url=jdbc:mysql://xxx:3306/summo-sbmy?allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull
  9. # 数据库用户名
  10. spring.datasource.username=xxx
  11. # 数据库密码
  12. spring.datasource.password=xxx
  13. # 数据库驱动类名
  14. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  15. # 初始化连接池时创建的连接数量
  16. spring.datasource.druid.initial-size=5
  17. # 连接池最大活跃连接数
  18. spring.datasource.druid.max-active=30
  19. # 连接池最小空闲连接数
  20. spring.datasource.druid.min-idle=5
  21. # 等待连接获取的最大等待时间
  22. spring.datasource.druid.max-wait=60000
  23. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接
  24. spring.datasource.druid.time-between-eviction-runs-millis=60000
  25. # 配置一个连接在池中最小生存的时间
  26. spring.datasource.druid.min-evictable-idle-time-millis=300000
  27. # 验证数据库连接有效的SQL语句
  28. spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
  29. # 是否在从连接池获取连接前进行检验(建议关闭,影响性能)
  30. spring.datasource.druid.test-while-idle=true
  31. # 获取连接时执行validationQuery检测连接是否有效(建议关闭,影响性能)
  32. spring.datasource.druid.test-on-borrow=false
  33. # 归还连接时执行validationQuery检测连接是否有效(建议关闭,影响性能)
  34. spring.datasource.druid.test-on-return=false
  35. # 是否开启PSCache(PreparedStatement缓存),默认false
  36. spring.datasource.druid.pool-prepared-statements=false
  37. # 指定每个连接上PSCache的大小,默认-1表示不限制
  38. spring.datasource.druid.max-pool-prepared-statement-per-connection-size=0
  39. # 启用监控统计和日志过滤器
  40. spring.datasource.druid.filters=stat,wall
  41. # 配置StatFilter的参数,合并SQL记录
  42. spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  43. # 是否合并Druid数据源的监控信息
  44. spring.datasource.druid.use-global-data-source-stat=true
  45. # 开启Wall过滤器,并指定数据库类型为MySQL
  46. spring.datasource.druid.filter.wall.enabled=true
  47. spring.datasource.druid.filter.wall.db-type=mysql
  48. # 配置StatFilter的数据库类型为MySQL
  49. spring.datasource.druid.filter.stat.db-type=mysql
  50. # 开启StatFilter
  51. spring.datasource.druid.filter.stat.enabled=true
  52. # MyBatis配置:自动映射行为设置为全字段
  53. mybatis.configuration.auto-mapping-behavior=full
  54. # MyBatis配置:下划线转驼峰命名规则
  55. mybatis.configuration.map-underscore-to-camel-case=true
  56. # MyBatis-Plus的Mapper文件位置
  57. mybatis-plus.mapper-locations=classpath*:/mybatis/mapper/*.xml
  58. # Redis数据库索引
  59. spring.redis.database=0
  60. # Redis连接超时时间(毫秒)
  61. spring.redis.timeout=1800000
  62. # Redis服务器地址
  63. spring.redis.host=127.0.0.1
  64. # Redis服务器端口
  65. spring.redis.port=6379
  66. # Redis服务器连接密码
  67. spring.redis.password=xxx
  68. # 使用Lettuce连接池时的最大等待时间(-1表示无限制)
  69. spring.redis.lettuce.pool.max-wait=-1
  70. # Lettuce连接池的最大空闲连接数
  71. spring.redis.lettuce.pool.max-idle=5
  72. # Lettuce连接池的最小空闲连接数
  73. spring.redis.lettuce.pool.min-idle=0
  74. # Lettuce连接池的最大活跃连接数
  75. spring.redis.lettuce.pool.max-active=20
  76. # 使用Jedis连接池时的最小空闲连接数
  77. spring.redis.jedis.pool.min-idle=8
  78. # Jedis连接池的最大空闲连接数
  79. spring.redis.jedis.pool.max-idle=500
  80. # Jedis连接池的最大活跃连接数
  81. spring.redis.jedis.pool.max-active=2000
  82. # Jedis连接池的最大等待时间(毫秒)
  83. spring.redis.jedis.pool.max-wait=10000

4. logback-spring.xml配置

点击展开代码
  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. <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"/>
  16. <!-- 将日志滚动输出到application.log文件中 -->
  17. <appender name="APPLICATION"
  18. class="ch.qos.logback.core.rolling.RollingFileAppender">
  19. <!-- 输出文件目的地 -->
  20. <file>${LOG_FILE}</file>
  21. <encoder>
  22. <pattern>${FILE_LOG_PATTERN}</pattern>
  23. <charset>utf8</charset>
  24. </encoder>
  25. <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 -->
  26. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  27. <!-- 文件命名格式 -->
  28. <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  29. <!-- 文件保留最大天数 -->
  30. <maxHistory>7</maxHistory>
  31. <!-- 文件大小限制 -->
  32. <maxFileSize>50MB</maxFileSize>
  33. <!-- 文件总大小 -->
  34. <totalSizeCap>500MB</totalSizeCap>
  35. </rollingPolicy>
  36. </appender>
  37. <!-- 摘取出WARN级别日志输出到warn.log中 -->
  38. <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
  39. <file>${WARN_LOG_FILE}</file>
  40. <encoder>
  41. <!-- 使用默认的输出格式打印 -->
  42. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  43. <charset>utf8</charset>
  44. </encoder>
  45. <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 -->
  46. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  47. <!-- 文件命名格式 -->
  48. <fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  49. <!-- 文件保留最大天数 -->
  50. <maxHistory>7</maxHistory>
  51. <!-- 文件大小限制 -->
  52. <maxFileSize>50MB</maxFileSize>
  53. <!-- 文件总大小 -->
  54. <totalSizeCap>500MB</totalSizeCap>
  55. </rollingPolicy>
  56. <!-- 日志过滤器,将WARN相关日志过滤出来 -->
  57. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  58. <level>WARN</level>
  59. </filter>
  60. </appender>
  61. <!-- 摘取出ERROR级别日志输出到error.log中 -->
  62. <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  63. <file>${ERROR_LOG_FILE}</file>
  64. <encoder>
  65. <!-- 使用默认的输出格式打印 -->
  66. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  67. <charset>utf8</charset>
  68. </encoder>
  69. <!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 -->
  70. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  71. <!-- 文件命名格式 -->
  72. <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  73. <!-- 文件保留最大天数 -->
  74. <maxHistory>7</maxHistory>
  75. <!-- 文件大小限制 -->
  76. <maxFileSize>50MB</maxFileSize>
  77. <!-- 文件总大小 -->
  78. <totalSizeCap>500MB</totalSizeCap>
  79. </rollingPolicy>
  80. <!-- 日志过滤器,将ERROR相关日志过滤出来 -->
  81. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  82. <level>ERROR</level>
  83. </filter>
  84. </appender>
  85. <!-- 配置控制台输出 -->
  86. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  87. <encoder>
  88. <pattern>${FILE_LOG_PATTERN}</pattern>
  89. <charset>utf8</charset>
  90. </encoder>
  91. </appender>
  92. <!-- 配置输出级别 -->
  93. <root level="INFO">
  94. <!-- 加入控制台输出 -->
  95. <appender-ref ref="CONSOLE"/>
  96. <!-- 加入APPLICATION输出 -->
  97. <appender-ref ref="APPLICATION"/>
  98. <!-- 加入WARN日志输出 -->
  99. <appender-ref ref="WARN"/>
  100. <!-- 加入ERROR日志输出 -->
  101. <appender-ref ref="ERROR"/>
  102. </root>
  103. </configuration>

5. 创建启动类

  1. package com.summo.sbmy;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.scheduling.annotation.EnableScheduling;
  5. /**
  6. * @author summo
  7. * @version Application.java, 1.0.0
  8. * @description 启动核心类
  9. * @date 2024年08月09
  10. */
  11. @SpringBootApplication(scanBasePackages = {"com.summo.sbmy"})
  12. @EnableScheduling
  13. public class Application {
  14. public static void main(String[] args) {
  15. SpringApplication.run(Application.class, args);
  16. }
  17. }

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

三、实现抖音热搜爬虫

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

1. 爬虫方案评估

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

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

  1. User-agent: *
  2. Allow: /
  3. 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格式复制”这一项。

复制出来是这样的东西

  1. 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没有白骗你下载吧!

代码如下

  1. OkHttpClient client = new OkHttpClient().newBuilder()
  2. .build();
  3. Request 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();
  22. Response response = client.newCall(request).execute();

4. 将代码迁移到应用中

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

  1. package com.summo.sbmy.job.douyin;
  2. import java.io.IOException;
  3. import com.alibaba.fastjson.JSONObject;
  4. import okhttp3.OkHttpClient;
  5. import okhttp3.Request;
  6. import okhttp3.Response;
  7. import org.springframework.scheduling.annotation.Scheduled;
  8. import org.springframework.stereotype.Component;
  9. /**
  10. * @author summo
  11. * @version DouyinHotSearchJob.java, 1.0.0
  12. * @description 抖音热搜Java爬虫代码
  13. * @date 2024年08月09
  14. */
  15. @Component
  16. public class DouyinHotSearchJob {
  17. /**
  18. * 定时触发爬虫方法,1个小时执行一次
  19. */
  20. @Scheduled(fixedRate = 1000 * 60 * 60)
  21. public void hotSearch() throws IOException {
  22. OkHttpClient client = new OkHttpClient().newBuilder()
  23. .build();
  24. Request request = new Request.Builder()
  25. .url("https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word/")
  26. .method("GET", null)
  27. .addHeader("accept",
  28. "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;"
  29. + "q=0.8,application/signed-exchange;v=b3;q=0.7")
  30. .addHeader("accept-language", "zh-CN,zh;q=0.9")
  31. .addHeader("cache-control", "no-cache")
  32. .addHeader("cookie",
  33. "ttwid=1%7CJ6ehEognyMAob_gD6oZwA40monN8E_sENr3IUZmuk7o%7C1712472728"
  34. + "%7C44b0cd0003fb75861789d62e56f014eaea3d198898a0ae9a947bf61d95d8ac1a; "
  35. + "__ac_signature=_02B4Z6wo00f01fFoqvgAAIDBFmj97SX8qiXxSK5AABr708; "
  36. + "__ac_referer=https://pre-dc-console.alibaba-inc.com/; "
  37. + "ttwid=1%7CX9ppA_NoTHJI9DG3JN7wNnZ662r-aJbZwCFPLLGK-og%7C1713836331"
  38. + "%7Cdbc79a439d0ecc994f60043d66b4ad3ff81c3820f3ab83ef85d30875cc59a18b")
  39. .addHeader("pragma", "no-cache")
  40. .addHeader("priority", "u=0, i")
  41. .addHeader("sec-ch-ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"")
  42. .addHeader("sec-ch-ua-mobile", "?0")
  43. .addHeader("sec-ch-ua-platform", "\"macOS\"")
  44. .addHeader("sec-fetch-dest", "document")
  45. .addHeader("sec-fetch-mode", "navigate")
  46. .addHeader("sec-fetch-site", "none")
  47. .addHeader("sec-fetch-user", "?1")
  48. .addHeader("upgrade-insecure-requests", "1")
  49. .addHeader("user-agent",
  50. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
  51. + "Chrome/126.0.0.0 Safari/537.36")
  52. .build();
  53. Response response = client.newCall(request).execute();
  54. System.out.println(JSONObject.toJSONString(response.body().string()));
  55. }
  56. }

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

四、小结一下

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

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

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

原文链接:https://www.cnblogs.com/wlovet/p/18350862

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号