利用HtmlUnit抓取百度api商家图片

本文介绍HtmlUnit这一Java页面分析工具的基本概念及其在小型爬虫项目中的应用案例。通过模拟浏览器行为,HtmlUnit能有效解析DOM元素并执行页面上的JavaScript代码,从而获取需要JS触发的数据。文中提供了一个具体示例,即利用HtmlUnit从百度地图POI详情页抓取图片URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HtmlUnit是什么?

1、htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。
2、采用的是Rhinojs引擎。模拟js运行
3、常规意义上,该项目可以用来进行页面的测试工作,实现网页自动化测试,(包括JS)
4、但是一般来说,在小型爬虫项目中,这种框架十分常用,可以有效的分析出 dom的标签,并且有效的运行页面上的js以便得到一些需要执行JS才能得到的值。

二、应用:获取百度API返回的详情url,从详情url抓取图片url
maven依赖:

<dependency>
  <groupId>net.sourceforge.htmlunit</groupId>
  <artifactId>htmlunit-core-js</artifactId>
  <version>2.23</version>
</dependency>

<dependency>
  <groupId>net.sourceforge.htmlunit</groupId>
  <artifactId>htmlunit</artifactId>
  <version>2.23</version>
</dependency>

<dependency>
  <groupId>xml-apis</groupId>
  <artifactId>xml-apis</artifactId>
  <version>1.4.01</version>
</dependency>

服务端代码:

/**
 * 从百度POI详情页获取图片url
 * @param poiUid
 * @return
 */
public static List<String> grabImgUrl(String poiUid) {

   if (StringUtils.isBlank(poiUid)) {
      return null;
   }

   final String IMG_LIST_URL = "http://map.baidu.com/detail?qt=caterphoto&type=list&ugc_ver=1&uid=";
   String detailUrl = IMG_LIST_URL + poiUid;
   log.info("grabImgUrl. detailUrl=" + detailUrl);

   final String DIV_ID = "photoContainer";
   final String TAG_IMG = "img";
   final String IMG_SRC = "src";

   try (final WebClient webClient = new WebClient()) {

       final HtmlPage page = webClient.getPage(detailUrl);

       if (page != null && page.isHtmlPage()) {

          Thread.sleep(40000);  // 等待页面加载完成。

          final HtmlDivision div = page.getHtmlElementById(DIV_ID);

          DomNodeList<HtmlElement> eleList = div.getElementsByTagName(TAG_IMG);

          List<String> imgUrlList = new ArrayList<String>();

          for (HtmlElement hele : eleList) {

             String imgUrl = hele.getAttribute(IMG_SRC);

             if (StringUtils.isNotBlank(imgUrl)) {
                log.info("imgUrl=" + imgUrl);
                imgUrlList.add(imgUrl);
             }
          }

          return imgUrlList;
       }
    } catch (Exception e) {
       log.error("grabImgUrl error.", e);
    }

   return null;
}

页面展示:

<c:forEach items="${imgs}" var="im">
      <div class="upload-block upload-block-avatar upload-block-reset">
          <img src="${im.picUrl }" class="pic">
          <div class="mask">
             <a href="javascript:void(0);" onclick="setMainImg(this);" class="set-cover">设为封面</a>
             <a href="javascript:void(0);" onclick="removeImg(this);" class="close">×</a>
           </div>
           <c:if test="${im.isCurr eq '1'}">
             <i class="icon-cover"></i>
             </c:if>
       </div>
</c:forEach>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值