微博热搜需用httpclient带user-agent、referer及cookie访问https://weibo.com/ajax/side/hotsearch接口,返回utf-8 json;poi写excel时须设日期/数字格式、用xssfworkbook、绝对路径并正确关闭流。

微博热搜页面反爬机制怎么绕过
直接用 HttpClient 发起 GET 请求会返回 403 或空内容,因为微博对非浏览器请求头做了拦截。真实访问必须带 User-Agent、Referer,且部分接口还校验 Cookie 中的 SSRF 或 WEIBOBEARER 字段。
实操建议:
- 先用浏览器开发者工具抓包,找到「热搜榜」实际请求地址(通常是
https://weibo.com/ajax/side/hotSearch),不是网页 URL - 复制浏览器请求中的
User-Agent和Referer,硬编码进HttpClient的 header - 该接口返回 JSON,不需要解析 HTML,别浪费时间写 Jsoup 解析器
- 不登录也能调用,但频率超过 10 次/分钟可能触发限流,加
Thread.sleep(2000)更稳妥
用 HttpClient 获取 JSON 数据时中文乱码
响应体显示为 \u5b98\u65b9 这类 Unicode 转义,说明没正确设置字符集。微博接口实际返回 UTF-8,但 HttpClient 默认按 ISO-8859-1 解码响应流。
实操建议:
- 不要用
EntityUtils.toString(entity)直接转字符串,它默认用 ISO-8859-1 - 改用
EntityUtils.toString(entity, "UTF-8") - 或者更可靠:用
BufferedReader包装entity.getContent(),并显式指定Charset.forName("UTF-8") - 如果用的是
CloseableHttpClient4.5+,可提前配置ContentType,但不如手动指定保险
POI 写 Excel 时日期和数字格式错乱
热搜榜单里有「实时上升」这类数字字段,以及「发布时间」这类时间字段,直接写入 Cell 会导致 Excel 显示为长整型(如 1715234400000)或科学计数法(如 1.23E+10)。
实操建议:
- 数字类字段(如「搜索指数」)用
cell.setCellValue((double) value),避免自动转成字符串 - 时间戳转日期:先用
Instant.ofEpochMilli(ts).atZone(ZoneId.systemDefault()).toLocalDateTime(),再用cell.setCellValue(localDateTime) - 必须配套设置单元格样式:
CellStyle要调用setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd hh:mm")) - 别用
HSSFWorkbook(.xls),微博数据量不大但字段含中文,优先选XSSFWorkbook(.xlsx),否则容易乱码或截断
保存 Excel 文件失败或打不开
常见报错是 IOException: The document has no logical structure 或双击文件提示「Excel 无法打开文件」,本质是流没关、文件路径非法或 workbook 没 write。
实操建议:
- 务必在
try-with-resources里声明FileOutputStream,别等 GC 关闭 - 路径别写相对路径如
"data.xls",用绝对路径或new File("data.xlsx").getAbsolutePath()看清实际位置 -
workbook.write(outputStream)必须在 close 前调用,顺序错了就生成空文件 - 如果目标目录不存在,先执行
new File(dirPath).mkdirs(),否则抛FileNotFoundException
真正卡住的地方往往不在代码逻辑,而在微博接口字段随时变动——今天叫 hot_word,明天可能改成 word;POI 对 Excel 样式和流的控制又很敏感,少一个 setCellStyle 或多一个 close 都可能导致文件损坏。动手前先 curl 一把接口,确认字段名和结构稳了再写 Java。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











