Java 网络爬虫笔记
一、基本概念
网络爬虫:自动抓取互联网数据的程序
本质:HTTP请求 + 数据解析 + 数据存储
二、核心流程
URL管理 → 请求发送 → 页面获取 → 数据解析 → 数据存储 → 去重
三、系统架构
调度器(Scheduler)
↓
URL队列(Queue)
↓
下载器(Downloader)
↓
解析器(Parser)
↓
数据管道(Pipeline)
↓
存储(DB / 文件)
补充模块:
去重(Deduplication)
反爬策略(Anti-Anti-Spider)
四、请求层(HTTP)
常用工具
HttpURLConnection(原生)
HttpClient(JDK11+)
OkHttp(推荐)
关键点
连接复用(Connection Pool)
超时控制(connect/read timeout)
重试机制(retry)
请求头伪装(User-Agent / Cookie)
五、数据解析
解析方式
| 方法 | 特点 |
|---|---|
| 正则 | 快,但不稳定 |
| XPath | 精准 |
| CSS选择器(Jsoup) | 易用 |
工具
Jsoup(HTML解析)
Jackson / Fastjson(JSON解析)
六、URL管理
策略
BFS(广度优先)
DFS(深度优先)
数据结构
队列(Queue)
优先级队列(PriorityQueue)
七、去重机制(重点)
方案
| 方法 | 问题 |
|---|---|
| HashSet | 内存占用大 |
| 数据库去重 | 慢 |
| BloomFilter ⭐ | 高效 |
BloomFilter特点
位数组 + 多哈希函数
空间效率高
存在误判(False Positive)
八、反爬机制
常见手段
User-Agent检测
IP限制
请求频率限制
Cookie校验
验证码
JS动态渲染
参数加密(token / sign)
应对策略
伪装请求头
使用代理IP池
限制请求频率(随机延迟)
维持登录态(Cookie)
抓取接口(绕过前端)
九、动态页面处理
本质
页面数据 = JS渲染结果 ≠ HTML源码
解决方案
抓接口(推荐)
分析XHR请求
Selenium模拟浏览器(低效)
十、并发模型
线程模型
单线程(简单)
多线程(高性能)
常见模式
生产者-消费者模型:
URL生产 → 爬虫消费
工具
ExecutorService(线程池)
十一、限流与稳定性
限流算法
固定延迟
随机延迟
令牌桶
漏桶
稳定性设计
请求失败重试
异常捕获
日志记录
十二、数据存储
存储方式
文件(txt / json)
关系型数据库(MySQL)
NoSQL(Redis / MongoDB)
优化
批量写入
异步存储
队列缓冲(Kafka)
十三、常见问题
编码问题(UTF-8 / GBK)
302重定向
返回假数据(反爬)
死循环(URL未去重)
JS加密参数无法解析
十四、性能优化
连接池复用
多线程并发
BloomFilter去重
接口抓取替代页面解析
异步处理
十五、法律与规范
遵守 robots.txt
控制请求频率
不抓取隐私数据
商业用途需授权
十六、面试高频总结
爬虫流程:请求 → 解析 → 存储
难点:反爬 + 动态页面
优化:并发 + 去重 + 限流
核心能力:抓接口
