You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。步骤如下:

    1. 打开浏览器开发者工具(F12),切换到「Network」标签,过滤「XHR」请求
    2. 刷新页面,找到加载影片列表的那个请求(通常URL里会有类似showtimes、movies的关键词)
    3. 复制该请求的URL、请求头(比如Referer、X-Requested-With)和参数
    4. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:37:46