当前位置: 首页 > news >正文

Java 爬虫零基础入门:从 HTTP 到 Jsoup 实战

🎯适合人群:Java 初学者、爬虫新手
⏱️阅读时长:30 分钟
📌你将收获:掌握 HTTP 请求、Jsoup 解析、实战爬取网页数据


📖 目录

  • 一、爬虫基础知识
  • 二、HTTP 请求入门
  • 三、Jsoup 解析 HTML
  • 四、实战案例
  • 五、常见问题
  • 六、面试题

一、爬虫基础知识

1.1 什么是爬虫?

爬虫:自动访问网页并提取数据的程序

应用场景

  • 数据采集(新闻、电商、招聘)
  • 价格监控
  • 竞品分析
  • SEO 监控

1.2 爬虫工作流程

① 发送 HTTP 请求 → ② 接收响应(HTML) ③ 解析 HTML → ④ 提取数据 → ⑤ 存储数据

1.3 合法性说明

⚠️ 重要提示

  • ✅ 爬取公开数据
  • ✅ 遵守 robots.txt
  • ❌ 禁止爬取个人隐私
  • ❌ 禁止商业侵权

二、HTTP 请求入门

2.1 使用 HttpURLConnection

importjava.io.*;importjava.net.HttpURLConnection;importjava.net.URL;publicclassSimpleHttpExample{publicstaticStringsendGet(StringurlStr)throwsIOException{URLurl=newURL(urlStr);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();// 设置请求方法conn.setRequestMethod("GET");conn.setRequestProperty("User-Agent","Mozilla/5.0");// 读取响应BufferedReaderreader=newBufferedReader(newInputStreamReader(conn.getInputStream()));StringBuilderresult=newStringBuilder();Stringline;while((line=reader.readLine())!=null){result.append(line);}reader.close();returnresult.toString();}}

2.2 使用 Apache HttpClient(推荐)

添加依赖

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version></dependency>

基础使用

importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;publicclassHttpClientExample{publicstaticStringsendGet(Stringurl)throwsIOException{// 创建 HttpClientCloseableHttpClienthttpClient=HttpClients.createDefault();// 创建 GET 请求HttpGethttpGet=newHttpGet(url);httpGet.setHeader("User-Agent","Mozilla/5.0");// 执行请求CloseableHttpResponseresponse=httpClient.execute(httpGet);// 获取响应内容Stringhtml=EntityUtils.toString(response.getEntity(),"UTF-8");// 关闭资源response.close();httpClient.close();returnhtml;}}

三、Jsoup 解析 HTML

3.1 添加依赖

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

3.2 基础使用

importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;publicclassJsoupExample{publicstaticvoidmain(String[]args)throwsIOException{// 方式1:从 URL 加载Documentdoc=Jsoup.connect("https://example.com").get();// 方式2:从 HTML 字符串解析Stringhtml="<html><body><h1>标题</h1></body></html>";Documentdoc2=Jsoup.parse(html);// 获取标题Stringtitle=doc.title();// CSS 选择器Elementslinks=doc.select("a[href]");for(Elementlink:links){Stringurl=link.attr("href");Stringtext=link.text();System.out.println(text+": "+url);}}}

3.3 CSS 选择器

选择器说明示例
tag标签选择器doc.select("div")
.classclass 选择器doc.select(".title")
#idid 选择器doc.select("#content")
[attr]属性选择器doc.select("a[href]")
parent > child子选择器doc.select("div > p")

四、实战案例

4.1 爬取豆瓣电影 Top250

importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;publicclassDoubanSpider{publicstaticvoidmain(String[]args)throwsIOException{List<Movie>movies=newArrayList<>();// 爬取前 3 页for(intpage=0;page<3;page++){Stringurl="https://movie.douban.com/top250?start="+(page*25);Documentdoc=Jsoup.connect(url).userAgent("Mozilla/5.0").timeout(5000).get();// 解析电影列表Elementsitems=doc.select(".item");for(Elementitem:items){Stringtitle=item.select(".title").first().text();Stringrating=item.select(".rating_num").first().text();Stringquote=item.select(".inq").text();Moviemovie=newMovie(title,rating,quote);movies.add(movie);System.out.println(movie);}// 休眠避免被封Thread.sleep(1000);}}}classMovie{privateStringtitle;privateStringrating;privateStringquote;// 构造方法、toString 省略}

4.2 爬取博客文章

publicclassBlogSpider{publicstaticvoidmain(String[]args)throwsIOException{Stringurl="https://blog.csdn.net/xxx/article/list/1";Documentdoc=Jsoup.connect(url).userAgent("Mozilla/5.0").get();// 文章列表Elementsarticles=doc.select(".article-item-box");for(Elementarticle:articles){Stringtitle=article.select("h4 a").text();Stringlink=article.select("h4 a").attr("href");Stringsummary=article.select(".content").text();System.out.println("标题: "+title);System.out.println("链接: "+link);System.out.println("摘要: "+summary);System.out.println("---");}}}

五、常见问题

5.1 中文乱码

// 设置编码Stringhtml=EntityUtils.toString(response.getEntity(),"UTF-8");// Jsoup 设置编码Documentdoc=Jsoup.parse(html,"UTF-8");

5.2 请求被拦截

// 设置 User-AgenthttpGet.setHeader("User-Agent","Mozilla/5.0");// 添加更多请求头httpGet.setHeader("Referer","https://www.google.com");httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");

5.3 超时设置

// Jsoup 超时Documentdoc=Jsoup.connect(url).timeout(10000).get();// HttpClient 超时RequestConfigconfig=RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(10000).build();httpGet.setConfig(config);

六、面试题

面试题 1:爬虫的基本流程是什么?

参考答案

  1. 发送 HTTP 请求
  2. 接收 HTML 响应
  3. 解析 HTML(Jsoup)
  4. 提取数据
  5. 存储数据(数据库/文件)

面试题 2:如何处理反爬虫?

参考答案

  1. 设置 User-Agent
  2. 添加请求头(Referer、Cookie)
  3. 设置延时(避免频繁请求)
  4. 使用代理 IP
  5. 处理验证码

面试题 3:Jsoup 和正则表达式的区别?

参考答案

对比Jsoup正则表达式
易用性简单(CSS 选择器)复杂
健壮性好(容错)
性能一般
推荐小数据量

面试题 4:爬虫如何避免被封?

参考答案

  1. 控制请求频率(延时)
  2. 使用代理 IP 池
  3. 模拟真实用户行为
  4. 遵守 robots.txt
  5. 分布式爬虫

总结

HTTP 请求:HttpClient、HttpURLConnection
HTML 解析:Jsoup(CSS 选择器)
实战案例:豆瓣电影、博客文章
反爬虫:User-Agent、延时、代理

下一篇预告:进阶爬虫技术(动态网页、多线程、WebMagic 框架)

http://www.jsqmd.com/news/570498/

相关文章:

  • 从沙子到手机:拆解一枚28nm CMOS芯片,看看你的手机CPU里到底藏了多少层‘楼’
  • 忍者像素绘卷微信小程序优化:像素图Canvas缩放+触摸手势支持
  • Android电池日志全解析:从healthd字段看懂手机充电那些事儿
  • 面向高算力高可靠需求的高端液冷AI服务器功率MOSFET选型策略与器件适配手册
  • 深入浅出MIPI D-PHY:对比HS高速模式与LP低功耗模式,揭秘手机摄像头省电又流畅的底层原理
  • intv_ai_mk11镜像免配置价值:节省开发者平均3.2小时/人的环境配置与调试时间
  • 高效全平台B站资源管理工具:3大创新功能重新定义视频下载体验
  • 告别串口线!用Rtty/Rttys搞定嵌入式设备远程调试,保姆级搭建与避坑指南
  • Neeshck-Z-lmage_LYX_v2实操案例:用‘赛博朋克城市夜景’生成4K壁纸
  • Qwen3.5-4B模型IDEA集成实战:本地化智能编程体验配置
  • 窗口总乱跑?PersistentWindows让你的桌面布局稳如泰山
  • 3步掌握DDrawCompat:轻松解决Windows老游戏兼容性的终极方案
  • AI Agent在互联网和工程领域的差异:为什么它能替你干活,却不能帮工程师?
  • 告别手动搜索!用Python脚本全自动刷Bing积分(附Windows配置避坑指南)
  • OpCore-Simplify:告别黑苹果配置烦恼,三步打造完美EFI的智能助手
  • iOS微信聊天记录数据提取全流程解析:非越狱解决方案
  • 增强macOS视频管理体验:QuickLookVideo解决Finder预览局限
  • 告别手动抢票:使用Python脚本实现大麦网自动化购票方案
  • 图片完整性批量验证:损坏图片筛选实践
  • OpenWrt 21.02实战:如何在MT7621平台上自定义路由器固件(附完整DTS配置)
  • Ultimate ASI Loader深度解析:构建Windows游戏插件生态系统的技术实践
  • 二极管单向导电性的秘密:为什么你的电路不工作?可能是二极管接反了!
  • Zotero Linter插件终极指南:如何快速整理你的学术文献库
  • Flow.js错误处理与容错机制:网络中断、服务器故障的智能恢复
  • 医师进修怎么办理?+弘印医师进修全国一站式服务 - 深度智识库
  • Phi-4-mini-reasoning企业落地:金融风控规则推理+合规性自动校验
  • 基于python的演唱会抢票系统
  • 新手零基础入门:用快马ai诊断并解决python安装常见错误
  • CHORD-X在宏观经济研究中的应用:自动生成季度宏观经济运行分析报告
  • Z-Image-Turbo_Sugar脸部Lora一文详解:Xinference模型服务健康检查自动化脚本