思路:通过淘宝搜索页链接,到达每个商品页;用正则表达式匹配出买过商品的用户名,并处理分页

大家看个意思吧,程序能运行,但taobao的购买者列表已经改成js调用了,没法直接采了。。
  1. package org.jason.web.spider.tabao;   
  2.   
  3. import java.io.BufferedReader;   
  4. import java.io.InputStreamReader;   
  5. import java.net.HttpURLConnection;   
  6. import java.net.URL;   
  7. import java.net.URLConnection;   
  8. import java.util.ArrayList;   
  9. import java.util.HashMap;   
  10. import java.util.List;   
  11. import java.util.Map;   
  12. import java.util.regex.Matcher;   
  13. import java.util.regex.Pattern;   
  14.   
  15.   
  16. public class UserSpider {   
  17.        
  18.     //下一页,区域正则表达式   
  19.     private static final String NEXT_PAGE="         <a href=\"(.*?)\" class=\"page-next\"><span>下一页</span></a>";   
  20.     private static final String LINK = "                                    <h3 class=\"summary\"><a href=\"(.*?)\"  target=_blank  onclick=\"(.*?)\"  class=\"EventCanSelect\">(.*?)</a></h3>";   
  21.     private static final String USER = "                                                <a href=\"http://space.taobao.com/(.*?)/portal/personal_portal.htm\" target=\"_blank\">(.*?)</a>";   
  22.        
  23.     private  static final String PAR= "?bid_page=1&page_size=100&is_start=true" ;   
  24.        
  25.     private static final int I_BREAK = 2;   
  26.        
  27.     /**  
  28.      * @param args  
  29.      */  
  30.     public static void main(String[] args) {   
  31.            
  32.         Map<String,String> map = new HashMap<String,String>();   
  33.            
  34.         String s="http://search1.taobao.com/browse/0/n-g,nfyg6za----------------40--commend-0-all-0.htm?at_topsearch=1&ssid=e-s5";   
  35.         List<String> l = getLinks(s);   
  36.         System.out.println("总链接数:"+l.size());   
  37.         for(String m : l)   
  38.         {   
  39.             List<String> o = getPages(m);   
  40.             System.out.println("页面数:"+o.size());   
  41.             for(String page : o)   
  42.             {   
  43.                 List<String> u = getUsers(page);   
  44.                    
  45.                 System.out.println("用户数:"+u.size());   
  46.                 for(String user : u){   
  47.                     if(map.get(user)==null){   
  48.                         map.put(user, user);   
  49.                     }   
  50.                 }   
  51.             }   
  52.         }   
  53.            
  54.         for(Map.Entry<String, String> entryTemp : map.entrySet()){   
  55.             System.out.println(entryTemp.getKey());   
  56.             //保存用户...   
  57.         }   
  58.            
  59.     }   
  60.   
  61.     private static List<String> getPages(String sUrl)   
  62.     {   
  63.         List<String> m = new ArrayList<String>();   
  64.         String sText = readURL(sUrl,false,System.getProperty("line.separator"));   
  65.         m = replaceAll(sText,LINK,1);   
  66.         return m;   
  67.     }   
  68.        
  69.        
  70.     /**  
  71.      * 取得页面内用户名  
  72.      * @param sUrl  
  73.      * @return  
  74.      */  
  75.     private static List<String> getUsers(String sUrl)   
  76.     {   
  77.         List<String> m = new ArrayList<String>();   
  78.         sUrl= sUrl+PAR;   
  79.         //System.out.println("页面:"+sUrl);   
  80.         String sText = readURL(sUrl,false,System.getProperty("line.separator"));   
  81.         m = replaceAll(sText,USER,2);   
  82.         return m;   
  83.     }   
  84.   
  85.     /**  
  86.      * 取得所有分页链接  
  87.      * @param baseUrl  
  88.      * @return  
  89.      */  
  90.     private static List<String> getLinks(String baseUrl)   
  91.     {   
  92.         List<String> s =new ArrayList<String>();   
  93.            
  94.         if ("".equals(baseUrl) || baseUrl==null){   
  95.             return s;   
  96.         }   
  97.            
  98.         String cur_url = baseUrl;   
  99.         s.add(cur_url);   
  100.         int i=0;   
  101.         String sText= "";   
  102.         while(true)   
  103.         {   
  104.                
  105.             sText = readURL(cur_url,false,System.getProperty("line.separator"));   
  106.                
  107.             if("".equals(sText))   
  108.             {   
  109.                 break;   
  110.             }   
  111.                
  112.             cur_url="";   
  113.                
  114.             cur_url = replace(sText,NEXT_PAGE,1);   
  115.                
  116.             if("".equals(cur_url))   
  117.             {   
  118.                 break;   
  119.             }   
  120.                
  121.             s.add(cur_url);   
  122.                
  123.                
  124.             //防止死循环   
  125.             i++;   
  126.             if(i>I_BREAK)   
  127.             {   
  128.                 break;   
  129.             }   
  130.         }   
  131.            
  132.         return s;   
  133.     }   
  134.   
  135.     // 得到正则表达式,所匹配的内容   
  136.     public static String replace(String str, String pattern, int place)   
  137.     {   
  138.         String result = "";   
  139.         if (str==null || "".equals(str))   
  140.             return result;   
  141.         else  
  142.         {   
  143.             try  
  144.             {   
  145.                 Pattern p = compile(pattern, 2);   
  146.                 Matcher m = p.matcher(str);   
  147.                 if (m.find())   
  148.                     result = m.group(place);   
  149.             }   
  150.             catch (Exception ex)   
  151.             {   
  152.                 ex.printStackTrace();   
  153.             }   
  154.   
  155.             return result;   
  156.         }   
  157.     }   
  158.   
  159.        
  160.     public static List<String> replaceAll(String str, String pattern,int i)   
  161.     {   
  162.         List<String> result = new ArrayList <String>();   
  163.            
  164.         if (str==null || "".equals(str))   
  165.             return result;   
  166.         else  
  167.         {   
  168.             try  
  169.             {   
  170.                 Pattern p = Pattern.compile(pattern);   
  171.                 Matcher m = p.matcher(str);   
  172.                 while (m.find()){   
  173.                     result.add(m.group(i));   
  174.                 }   
  175.             }   
  176.             catch (Exception ex)   
  177.             {   
  178.                 ex.printStackTrace();   
  179.             }   
  180.   
  181.             return result;   
  182.         }   
  183.     }      
  184.        
  185.        
  186.     public static Pattern compile(String pattern, int mode)   
  187.     {   
  188.         return Pattern.compile(pattern, mode);   
  189.     }      
  190.        
  191.     public static String readURL(String url, boolean isPost, String line)   
  192.     {   
  193.         BufferedReader bufferedReader;   
  194.         StringBuffer sBuffer = new StringBuffer();   
  195.         try  
  196.         {   
  197.             URL urlPath = new URL(url);   
  198.             URLConnection urlConnection = urlPath.openConnection();   
  199.             HttpURLConnection httpURL = (HttpURLConnection) urlConnection;   
  200.                
  201.             if (isPost) httpURL.setRequestMethod("POST");   
  202.   
  203.             try  
  204.             {   
  205.                 httpURL.connect();   
  206. //                System.out.println("内容类型: "+httpURL.getContentType());    
  207. //                System.out.println("内容编码: "+httpURL.getContentEncoding());    
  208. //                System.out.println("内容长度: "+httpURL.getContentLength());    
  209. //                System.out.println("创建日期: "+new Date(httpURL.getDate()));    
  210. //                System.out.println("最后修改日期: "+new Date(httpURL.getLastModified()));    
  211. //                System.out.println("终止日期: "+new Date(httpURL.getExpiration()));                    
  212.             }   
  213.             catch (Exception e)   
  214.             {   
  215.                 e.printStackTrace();   
  216.             }   
  217.                
  218.             int httpResult = httpURL.getResponseCode();   
  219.             if (httpResult == HttpURLConnection.HTTP_OK)   
  220.             {   
  221.                    
  222.                 bufferedReader = new BufferedReader(new InputStreamReader(httpURL.getInputStream()));   
  223.                 String sContent;   
  224.                    
  225.                 while ((sContent = bufferedReader.readLine()) != null)   
  226.                 {   
  227.                     sBuffer.append(sContent).append(line);   
  228.                 }   
  229.   
  230.                 bufferedReader.close();   
  231.             }   
  232.                
  233.             httpURL.disconnect();   
  234.         }   
  235.         catch (Exception ex)   
  236.         {   
  237.             ex.printStackTrace();   
  238.         }   
  239. //   
  240.         return sBuffer.toString();   
  241.     }      
  242.        
  243.        
  244. }