jsoup连接超时或403被拒绝时,需显式设置.timeout(10000)和.useragent(),补充referer等请求头;遇懒加载取data-src,用absurl()补全路径,下载前解析url并编码中文文件名,控制并发防封ip。

Jsoup连接超时或403被拒绝怎么办
直接用 Jsoup.connect(url).get() 经常卡住或抛出 IOException,不是代码写错了,而是目标网站加了反爬或网络不稳定。默认超时是 3 秒,很多服务器响应慢一点就直接失败;更常见的是没带 User-Agent,被当成爬虫直接 403 拒绝。
- 必须显式设置超时:用
.timeout(10000)(单位毫秒),10 秒对大多数网页够用 - 一定要加请求头:用
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"),否则多数新闻、博客类站点会拦 - 如果仍 403,先用浏览器开发者工具看真实请求的
User-Agent和是否带Referer,再补上.header("Referer", "https://example.com")
用select()提取img标签src但结果为空
写 doc.select("img[src]") 却拿不到链接?常见原因是 HTML 里 src 是懒加载属性(比如 data-src),或者图片在 JS 渲染后才插入 DOM —— Jsoup 不执行 JS,只解析原始 HTML。
- 先检查原始 HTML 是否真有
src:用System.out.println(doc.html())打印出来看一眼 - 遇到
data-src或data-original,改用img.attr("data-src")取值 - 如果
select("img")能拿到元素但.attr("src")返回空字符串,说明属性名不对,用.attributes()看全量属性 - 绝对路径和相对路径要处理:用
img.absUrl("src")自动补全成完整 URL,别用img.attr("src")直接拼
下载图片时文件名重复或乱码
从 src 提取文件名用 url.substring(url.lastIndexOf("/")+1) 很容易出错:URL 带查询参数(如 ?v=2023)、中文名未编码、后缀缺失都会导致保存失败或打不开。
- 用
java.net.URL解析再取路径:new URL(imgUrl).getPath(),比字符串截取可靠 - 文件名含中文?用
URLEncoder.encode(filename, "UTF-8")编码,但注意只编码文件名部分,别把整个 URL 都 encode - 没后缀的 URL(如
https://site.com/pic/123)要根据Content-Type推断:下载前发 HEAD 请求,或用Connection.head().execute().contentType() - 多个图片同名?在保存前加时间戳或哈希前缀,比如
"img_" + System.currentTimeMillis() + "_" + filename
批量抓取时内存爆掉或线程阻塞
循环里反复调用 Jsoup.connect() 不关连接、不控制并发,跑几十个链接就 OOM 或线程卡死。Jsoup 默认用 HttpURLConnection,不自动复用连接,也不限速。
立即学习“Java免费学习笔记(深入)”;
- 每个
Connection调用完不用管,但大循环里建议加Thread.sleep(500)降低频率,避免被封 IP - 别用
ExecutorService无限制开线程:最多设 3–5 个线程,用Executors.newFixedThreadPool(3) - 大 HTML 文档(>1MB)解析慢且吃内存,用
.maxBodySize(0)关闭 body 大小限制,但得确保你真需要全部内容 - 如果只是扒图,没必要 parse 整个文档:用
Jsoup.parseBodyFragment(htmlString)更轻量
真正麻烦的从来不是怎么取到 src,而是 URL 是否有效、重定向是否跟、图片是否已删、服务器是否限流——这些没法靠 selector 一行代码解决。











