用HtmlUnit和httpClient抓施華洛世奇網站圖片和動畫

讓我們先看看施華洛世奇網站界面http://www.swarovski-crystallized.com/吧,這個頁面離我們需要抓去頁面有4層菜單,也就是需要點擊四次纔到達我們的目標頁面。這個頁面有5個菜單,每個菜單需要深入4層菜單。我們簡稱爲CatchMenu1;經測試,4個線程同時抓去需要5個多小時分析



 第二層菜單界面,注意這個頁面下面還有分頁一頁一頁的,我們簡稱爲CatchMenu2

 第三層菜單界面,我們簡稱爲CatchMenu3,注意這個頁面下面還有分頁哦:



 終於到達我們的目標頁面了:



 

 

好了,需求就是這麼簡單,開工吧。

1.建立一個菜單模型類:

public class CatchMenuDO implements Serializable
{
 private Long id;
 private Long parentId;//該菜單的父菜單ID
 private String name; //該菜單名稱
 private String name_url; //菜單對應的頁面
    private Integer level; //第幾層菜單,1表示第一層,2表示第二層,依次類推
    private Date gmCreate;
    private Date gmModify;
    private Boolean fetched=false; //是否已經抓去分析了
    private Boolean isLastChild=false; //是否是最小葉菜單,即最後一層的菜單
    private String parentName;//父菜單名稱

...................................................................................////////////省略

.....................................................................................

}

 2.建立連接數據庫獲取保存菜單以及產品信息DAO類:

public class SwaroSkiDAOImpl extends SqlMapClientDaoSupport implements SwaroSkiDAO
{
 public int addProduct(Product product)
 {
  getSqlMapClientTemplate().insert("SwaroSkiDAO.addProduct", product);
     return 1;
 }
 public Long addProductColor(ProductColor color)
 {
  Long result= (Long) getSqlMapClientTemplate().insert("SwaroSkiDAO.addProductColor", color);
     return result;
 }
 public Long addProductImageSwf(ProductImageSwf imageswf)
 {
  Long result= (Long) getSqlMapClientTemplate().insert("SwaroSkiDAO.addProductImageSwf", imageswf);
return result;
 }


 public Long addProductSize(ProductSize size)
 {
  Long result= (Long) getSqlMapClientTemplate().insert("SwaroSkiDAO.addProductSize", size);
     return result;
 }
 public List<CatchMenuDO> getCatchMenuList(CatchMenuQueryModel menuModel)
 {
  List<CatchMenuDO> list= (List<CatchMenuDO>)getSqlMapClientTemplate().queryForList("SwaroSkiDAO.getCatchMenu", menuModel);  
  return list;
 }

}

3.數據庫SQL:

 <select id="SwaroSkiDAO.getCatchMenu"  resultMap="CatchMenuDO" parameterClass="xxxx.xxxx.xxxx.CatchMenuQueryModel">

//這個sql的意思就是獲取指定層,指定父類菜單下面所有子菜單
    SELECT  ID, parent_ID, name, name_url,
    menu_level, gm_create,gm_modify,fetched,
    is_last_child,parent_name
    FROM  page_catch_menu
    where 1=1
             <isNotNull property="level" prepend="  and  ">
                             menu_level =#level#
             </isNotNull>
             <isNotNull property="parentIdList" prepend="  and  ">  
                parent_ID IN   
                <iterate property="parentIdList" open="(" close=")" conjunction=",">  
                     #parentIdList[]#  
                </iterate>  
</isNotNull>
 </select>

 

5.終於開始正式開工了:

public class CatchManagerImpl implements ICatchManager

{

 private SwaroSkiDAO swaroSkiDAO;//訪問數據庫的
 private static final transient Log log = LogFactory .getLog(CatchManagerImpl.class);
 private static ExecutorService pools = Executors.newFixedThreadPool(5);//線程池
 private Semaphore sem=new Semaphore(5);//同步信號,多線程開工

public void catchPages()
 {

//這個sql的意思就是獲取指定層,指定父類菜單下面所有子菜單
  CatchMenuQueryModel menu = new CatchMenuQueryModel();
  menu.setFetched(false);
  List<Long> parentIdList=new ArrayList<Long>();
  parentIdList.add(1L);
  parentIdList.add(2L);
  menu.setLevel(2);
  List<CatchMenuDO> menus = swaroSkiDAO.getCatchMenuList(menu);

 

//使用htmlunit去抓去,模擬火狐瀏覽器並禁止js,activex組建運行,強啊,htmlunit還可以運行js和activex組建.不愧號稱java 語言的瀏覽器啊
  WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
  webClient.setJavaScriptEnabled(false);
  webClient.setActiveXNative(false);
List<String> secondPageUrls = new ArrayList<String>();
  List<String> thirdPageUrls = new ArrayList<String>();
  log.error("第一層抓取開始..........");

if (menus != null && menus.size() > 0)
  {
   for (CatchMenuDO mn : menus)
   {
    String url = "http://www.swarovski-crystallized.com/jewelry/us/";
    url = url + mn.getParentName() + mn.getName_url();
    HtmlPage mainPage = null;
    log.error("開始抓取第一層頁面:"+url);
    try
    {
     mainPage = webClient.getPage(url);
    } catch (Exception e)
    {

發佈了17 篇原創文章 · 獲贊 0 · 訪問量 2942
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章