Java自学爬虫项目:HtmlUnit爬取CinemaCityShowtimes页面异常问题
解决CinemaCityShowtimes影片列表爬取的HtmlUnit问题
我之前也踩过类似AJAX加载页面用HtmlUnit爬取的坑,针对CinemaCityShowtimes这个网站的情况,你可以试试下面几个方向排查和解决:
模拟更真实的浏览器环境
HtmlUnit默认的配置很容易被网站识别为爬虫,你可以把它配置得更贴近真实Chrome浏览器:WebClient webClient = new WebClient(BrowserVersion.CHROME); // 启用JavaScript(必须,因为是AJAX加载) webClient.getOptions().setJavaScriptEnabled(true); // 设置真实的User-Agent(可以复制你自己浏览器的User-Agent) webClient.getBrowserVersion().setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); // 启用Cookie,模拟会话 webClient.getCookieManager().setCookiesEnabled(true); // 设置窗口大小,避免被识别为无头浏览器 webClient.getOptions().setWindowSize(new Dimension(1920, 1080)); // 等待后台JavaScript执行完成(根据实际情况调整时间,比如5秒) webClient.waitForBackgroundJavaScript(5000);另外,还可以关闭HtmlUnit对JS错误的严格校验,有些网站的JS有小瑕疵但浏览器能忽略,HtmlUnit默认可能会中断渲染:
webClient.getOptions().setThrowExceptionOnScriptError(false);直接抓取AJAX接口(更高效)
既然知道影片列表是AJAX加载的,不如跳过页面渲染,直接调用后端API。步骤如下:- 打开浏览器开发者工具(F12),切换到「Network」标签,过滤「XHR」请求
- 刷新页面,找到加载影片列表的那个请求(通常URL里会有类似
showtimes、movies的关键词) - 复制该请求的URL、请求头(比如
Referer、X-Requested-With)和参数 - 用HttpClient或OkHttp直接发送HTTP请求,获取返回的JSON/XML数据,解析起来比处理HTML简单得多
等待DOM完全更新后再抓取
如果一定要用HtmlUnit渲染页面,除了设置waitForBackgroundJavaScript,还可以主动等待目标元素出现:HtmlPage page = webClient.getPage("你的目标URL"); // 等待影片列表容器加载完成,最多等10秒 webClient.waitForCondition( () -> page.getElementById("movie-list") != null, 10000 ); // 此时再获取页面内容 String pageContent = page.asXml();
这些方法应该能帮你解决大部分问题,优先试试直接抓AJAX接口,这个方案不仅效率高,还能避开很多渲染相关的坑。
内容的提问来源于stack exchange,提问作者Łukasz Milunas
相关产品推荐
相关产品推荐

