文科生转码踩坑记:从零用SpringBoot写个爬虫,顺便拿下求职面试题
大家好,我是小林,曾经是个每天和鲁迅、莎士比亚打交道的中文系学生。三年前,我坐在图书馆啃《Java核心技术》时,连“类”和“对象”都分不清。如今,我靠自学进了大厂做后端开发,还经常被同事夸“你这文科生讲技术比我们科班还清楚”。
今天这篇教程,就是想把我当初从零开始学 SpringBoot、做 爬虫、准备 求职面试题 的完整路径,用最直白的话讲给你听。不画大饼,不堆术语,只讲我踩过的坑、走过的弯路,和真正能跑起来的代码。
如果你也是零基础,别怕——连我都能行,你当然也可以。
为什么是 SpringBoot + 爬虫?
很多初学者一上来就问:“我该学什么框架?”
我的建议很实在:先做一个能解决实际问题的小项目。
爬虫,就是一个绝佳的切入点。它能:
- 让你理解 HTTP 请求、数据解析、异常处理
- 锻炼你调用第三方库的能力
- 最重要的是——面试官爱问!
而 SpringBoot,是目前 Java 后端最主流的开发框架。它帮你自动配置了 90% 的繁琐设置,让你专注写业务逻辑。很多公司招人,JD 上直接写着“熟悉 SpringBoot”。
所以,用 SpringBoot 写一个简单的网页爬虫,既能练手,又能为求职加分——这就是我当初的选择。
第一步:环境搭建(别跳过!)
我当初第一次装环境,花了整整两天,因为网上教程要么太老,要么默认你懂 Maven。下面是我亲测有效的步骤:
1. 安装 JDK(Java 开发工具包)
- 推荐版本:JDK 17(长期支持,SpringBoot 3.x 默认支持)
- 下载地址:https://adoptium.net/
- 安装后,在终端输入:
如果看到类似java -versionopenjdk version "17.0.10",说明成功了。
⚠️ 常见坑:别装 JRE(运行环境),要装 JDK(开发环境)!JRE 不能编译代码。
2. 安装 IDE(推荐 IntelliJ IDEA)
- 社区版免费,足够用:https://www.jetbrains.com/idea/download/
- 安装时勾选“.java 文件关联”,以后双击 .java 文件就能打开。
3. 创建 SpringBoot 项目(两种方式)
方式一:用 Spring Initializr(推荐新手)
- 打开 https://start.spring.io/
- 填写:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x(最新稳定版)
- Group:
com.example(随便写,但要有域名格式) - Artifact:
crawler-demo
- 添加依赖(Dependencies):
- Spring Web(必须!用于启动 Web 服务)
- Lombok(可选,减少样板代码)
- 点击 “Generate”,下载 ZIP 包,解压后用 IDEA 打开。
方式二:IDEA 内置创建
- File → New → Project → Spring Initializr
- 后续步骤同上。
✅ 小技巧:项目导入后,等 IDEA 自动下载依赖(右下角有进度条)。如果卡住,可以手动点 Maven 面板的“Reload”。
第二步:理解核心概念(用大白话)
什么是 SpringBoot?
想象你要开一家餐厅:
- 传统 Java:你要自己砌灶台、买锅、装水电……
- SpringBoot:它已经给你装修好厨房,你只要专注“炒菜”(写业务逻辑)就行。
它的核心思想是 “约定优于配置” —— 比如你放一个 Controller 类,它自动知道这是处理网页请求的。
什么是爬虫?
简单说,就是模拟浏览器去访问网页,然后把想要的数据“抓”下来。
比如你想抓豆瓣电影 Top250 的电影名:
- 发送请求到
https://movie.douban.com/top250 - 服务器返回 HTML 页面
- 你用代码从 HTML 里提取
<span class="title">肖申克的救赎</span> - 保存到数据库或文件
为什么用 SpringBoot 写爬虫?
- 可以做成 Web 服务:别人访问
/crawl就能触发爬虫 - 方便集成数据库、定时任务、日志监控
- 面试时可以说:“我用 SpringBoot 构建了一个可扩展的爬虫系统”
第三步:动手写一个电影爬虫
我们来抓取豆瓣 Top250 的电影名称和评分。目标:访问 http://localhost:8080/movies,返回 JSON 数据。
1. 添加必要依赖
在 pom.xml 的 <dependencies> 中加入:
<!-- 网络请求库 -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<!-- HTML 解析库(Jsoup) -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
💡 为什么用 Jsoup?因为它像 jQuery 一样简单,能用 CSS 选择器找元素。
2. 创建 Movie 实体类
// src/main/java/com/example/crawlerdemo/model/Movie.java
package com.example.crawlerdemo.model;
import lombok.Data;
@Data // Lombok 自动生成 getter/setter
public class Movie {
private String title;
private String rating;
}
3. 编写爬虫逻辑
// src/main/java/com/example/crawlerdemo/service/CrawlerService.java
package com.example.crawlerdemo.service;
import com.example.crawlerdemo.model.Movie;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
public class CrawlerService {
public List<Movie> crawlTop250() throws IOException {
List<Movie> movies = new ArrayList<>();
String url = "https://movie.douban.com/top250";
// 1. 发送请求,获取网页 HTML
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
.timeout(5000)
.get();
// 2. 用 CSS 选择器定位电影列表
Elements items = doc.select("div.item");
// 3. 遍历每个电影项
for (Element item : items) {
Movie movie = new Movie();
// 提取标题(注意:可能有中文和英文两个标题)
movie.setTitle(item.select("span.title").first().text());
// 提取评分
movie.setRating(item.select("span.rating_num").text());
movies.add(movie);
}
return movies;
}
}
⚠️ 注意:豆瓣有反爬机制!如果频繁请求会被封 IP。所以加了
userAgent和timeout,模拟真实浏览器。
4. 创建 Web 接口
// src/main/java/com/example/crawlerdemo/controller/CrawlController.java
package com.example.crawlerdemo.controller;
import com.example.crawlerdemo.model.Movie;
import com.example.crawlerdemo.service.CrawlerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.List;
@RestController
public class CrawlController {
@Autowired
private CrawlerService crawlerService;
@GetMapping("/movies")
public List<Movie> getMovies() throws IOException {
return crawlerService.crawlTop250();
}
}
5. 运行项目
- 点击
CrawlerDemoApplication.java的绿色三角形运行 - 浏览器访问:
http://localhost:8080/movies - 你应该看到类似这样的 JSON:
[
{"title":"肖申克的救赎","rating":"9.7"},
{"title":"霸王别姬","rating":"9.6"},
...
]
🎉 恭喜!你完成了第一个 SpringBoot 爬虫项目!
第四步:常见问题 & 避坑指南
❌ 问题1:运行时报 Connection refused 或超时
- 原因:豆瓣屏蔽了无头请求。
- 解决方案:
- 加
userAgent(如上所示) - 降低请求频率(加
Thread.sleep(2000)) - 考虑用代理 IP(进阶)
- 加
❌ 问题2:中文乱码
- 原因:网页编码不是 UTF-8。
- 解决方案:在 Jsoup.connect 后加
.charset("UTF-8")
❌ 问题3:Maven 依赖下载失败
- 解决方案:
- 检查网络
- 在 IDEA 中 File → Settings → Build → Maven,确认本地仓库路径
- 删除
.m2/repository下对应的文件夹,重新 Reload
❌ 问题4:面试被问“爬虫合法吗?”
- 回答要点:
- 遵守
robots.txt(如https://douban.com/robots.txt) - 不高频请求,不影响服务器
- 仅用于学习,不商用
- 优先使用官方 API(如豆瓣有公开 API)
- 遵守
第五步:如何把项目变成面试亮点?
光会跑代码不够,面试官更看重你的思考和优化能力。
面试题1:如何避免被反爬?
| 策略 | 说明 |
|---|---|
| 随机 User-Agent | 模拟不同浏览器 |
| 设置请求间隔 | Thread.sleep(1000~3000) |
| 使用代理池 | 轮换 IP(可用免费代理网站) |
| 处理验证码 | 人工打码 or OCR 识别(进阶) |
面试题2:如何提高爬虫效率?
- 多线程:用
CompletableFuture并发抓多个页面 - 异步非阻塞:用 WebClient(Spring WebFlux)替代同步 HTTP
- 分布式:用 Redis 队列分发任务(高级)
面试题3:数据怎么存储?
- 小数据:存 CSV / JSON 文件
- 中数据:用 H2(内存数据库)或 SQLite
- 大数据:MySQL + 分页存储,或 Elasticsearch
💡 我的建议:在简历中写“实现基于 SpringBoot 的豆瓣电影爬虫,支持防反爬策略与 JSON 输出,代码开源在 GitHub”。哪怕只有 100 行,也比“熟悉 SpringBoot”有力得多。
下一步学习建议
深入 SpringBoot:
- 学习
@Configuration、@Bean、自动配置原理 - 试试集成 MyBatis 存到数据库
- 学习
爬虫进阶:
- 抓动态页面(用 Selenium + ChromeDriver)
- 处理登录(Cookie / Session 管理)
求职准备:
- 刷《SpringBoot 常见面试题 50 道》
- 把项目部署到云服务器(阿里云学生机 10 元/月)
保持输出:
- 写技术博客(就像我这样)
- 在 GitHub 更新 README,展示你的思考
最后的话
我当初学的时候,也以为“爬虫=黑客”,以为“SpringBoot=天书”。但只要你愿意一行行敲代码,遇到报错就 Google,把每一个红色错误变成绿色运行,你就在成为程序员的路上了。
技术没有捷径,但有方法。希望这篇踩坑指南,能让你少走点弯路。
记住:你不是在学 SpringBoot,你是在解决问题。而解决问题的人,永远不缺工作。
字数统计:3647 字
(完)

评论 0