java jsoup 网络爬虫

来源:互联网 发布:闪电购入驻淘宝了吗 编辑:程序博客网 时间:2024/05/15 23:54
Java代码  收藏代码
  1. package com.iteye.injavawetrust.gethtml;  
  2.   
  3. import java.util.Map;  
  4. import java.util.Set;  
  5.   
  6. /** 
  7.  *  
  8.  * @author InJavaWeTrust 
  9.  * 
  10.  */  
  11. public class GetHtml {  
  12.       
  13.     private static JsoupUtil ju = JsoupUtil.getInstance();  
  14.       
  15.     public void getHtml(String url){  
  16.         ju.initUnvisitedUrl(url);  
  17.         //待访问队列不为空,已访问<10000  
  18.         while(!HtmlQueue.unVisitedUrlsEmpty() && HtmlQueue.getVisitedUrlNum() < 10000){  
  19.             String visitUrl = (String) HtmlQueue.unVisitedUrlDeQueue();  
  20.             if(null == visitUrl){  
  21.                 continue;  
  22.             }  
  23.             Map<String, String> map = ju.getHtml(visitUrl);  
  24.             if(0 == map.size()){  
  25.                 continue;  
  26.             }  
  27.             ju.getHtmlToLocal(map); //将html写如本地文件  
  28.             HtmlQueue.addVisitedUrl(visitUrl); //将该URL放入到已访问的URL队列中  
  29.             Set<String> links = ju.getAllUrl(visitUrl); //提取出下载网页中的URL  
  30.             for(String link :links){  
  31.                 if(!link.startsWith(Constants.URL)){  
  32.                     continue;  
  33.                 }  
  34.                 if(!ju.checkURL(link)){  
  35.                     continue;  
  36.                 }  
  37.                 // 新的未访问的 URL加入队待访问的 URL队列  
  38.                 HtmlQueue.addUnvisitedUrl(link);  
  39.             }  
  40.               
  41.         }  
  42.     }  
  43.       
  44.     public static void main(String[] args) {  
  45.         GetHtml gh = new GetHtml();  
  46.         long starTime = System.currentTimeMillis();  
  47.         gh.getHtml(Constants.URL);  
  48.         long endTime = System.currentTimeMillis();  
  49.         System.out.println("共下载 [" + HtmlQueue.getVisitedUrlNum() + "]");  
  50.         System.out.println("用时 [" + ju.msToss(endTime - starTime) + "]");  
  51.     }  
  52.   
  53. }  
  54.   
  55. 下载 
  56. package com.iteye.injavawetrust.gethtml;  
  57.   
  58. import java.util.HashSet;  
  59. import java.util.PriorityQueue;  
  60. import java.util.Queue;  
  61. import java.util.Set;  
  62.   
  63. /** 
  64.  *  
  65.  * @author InJavaWeTrust 
  66.  * 
  67.  */  
  68. public class HtmlQueue {  
  69.   
  70.     /** 
  71.      * 已访问的URL队列 
  72.      */  
  73.     private static Set<String> visitedUrl = new HashSet<String>();  
  74.     /** 
  75.      * 待访问的 URL队列 
  76.      */  
  77.     private static Queue<String> unVisitedUrl = new PriorityQueue<String>();  
  78.     /** 
  79.      * 获得待访问URL队列 
  80.      * @return 
  81.      */  
  82.     public static Queue<String> getUnVisitedUrl() {  
  83.         return unVisitedUrl;  
  84.     }  
  85.     /** 
  86.      * 添加到访问过的URL队列中 
  87.      * @param url 
  88.      */  
  89.     public static void addVisitedUrl(String url) {  
  90.         visitedUrl.add(url);  
  91.     }  
  92.     /** 
  93.      * 移除访问过的URL 
  94.      * @param url 
  95.      */  
  96.     public static void removeVisitedUrl(String url) {  
  97.         visitedUrl.remove(url);  
  98.     }  
  99.     /** 
  100.      * 未访问的URL出队列 
  101.      * @return 
  102.      */  
  103.     public static Object unVisitedUrlDeQueue() {  
  104.         return unVisitedUrl.poll();  
  105.     }  
  106.     /** 
  107.      * 添加到待访问的 URL队列,保证每个URL只被访问一次 
  108.      * @param url 
  109.      */  
  110.     public static void addUnvisitedUrl(String url) {  
  111.         if (url != null && !url.trim().equals("") && !visitedUrl.contains(url)  
  112.                 && !unVisitedUrl.contains(url))  
  113.             unVisitedUrl.add(url);  
  114.     }  
  115.     /** 
  116.      * 获得已经访问的URL数目 
  117.      * @return 
  118.      */  
  119.     public static int getVisitedUrlNum() {  
  120.         return visitedUrl.size();  
  121.     }  
  122.     /** 
  123.      * 判断未访问的URL队列中是否为空 
  124.      * @return true-空;false-非空 
  125.      */  
  126.     public static boolean unVisitedUrlsEmpty() {  
  127.         return unVisitedUrl.isEmpty();  
  128.     }  
  129.   
  130. }  
  131.   
  132.   
  133. package com.iteye.injavawetrust.gethtml;  
  134.   
  135. /** 
  136.  *  
  137.  * @author InJavaWeTrust 
  138.  * 
  139.  */  
  140. public class Constants {  
  141.       
  142.     public static String URL = "http://www.jqu.net.cn";  
  143.       
  144.     public static String HTMLPATH = "E:\\InJavaWeTrust\\jsoup\\html\\";  
  145.   
  146. }  
  147.   
  148.   
  149. package com.iteye.injavawetrust.gethtml;  
  150.   
  151. import java.io.File;  
  152. import java.io.FileNotFoundException;  
  153. import java.io.FileOutputStream;  
  154. import java.io.IOException;  
  155. import java.io.OutputStreamWriter;  
  156. import java.io.Writer;  
  157. import java.text.SimpleDateFormat;  
  158. import java.util.HashMap;  
  159. import java.util.HashSet;  
  160. import java.util.Iterator;  
  161. import java.util.Map;  
  162. import java.util.Set;  
  163. import java.util.TimeZone;  
  164.   
  165. import org.jsoup.Jsoup;  
  166. import org.jsoup.nodes.Document;  
  167. import org.jsoup.nodes.Element;  
  168. import org.jsoup.select.Elements;  
  169.   
  170. /** 下载 
  171.  *  
  172.  * @author InJavaWeTrust 
  173.  * 
  174.  */  
  175. public class JsoupUtil {  
  176.       
  177.     private JsoupUtil() {  
  178.           
  179.     }  
  180.       
  181.     private static final JsoupUtil instance = new JsoupUtil();  
  182.       
  183.     public static JsoupUtil getInstance() {  
  184.         return instance;  
  185.     }  
  186.       
  187.     /** 
  188.      * 初始化待访问URL队列 
  189.      * @param url URL 
  190.      */  
  191.     public void initUnvisitedUrl(String url) {  
  192.         HtmlQueue.addUnvisitedUrl(url);  
  193.     }  
  194.       
  195.     /** 
  196.      * 获取URL 
  197.      * @param url URL 
  198.      * @return URL 
  199.      */  
  200.     public Set<String> getAllUrl(String url){  
  201.         Set<String> urls = new HashSet<String>();  
  202.         try {  
  203.             Document document = Jsoup.connect(url).timeout(5000).get();  
  204.             Elements hrefs = document.select("a[href]");  
  205.             Iterator<Element> hrefIter = hrefs.iterator();  
  206.             while (hrefIter.hasNext()) {  
  207.                 Element href = hrefIter.next();  
  208.                 urls.add(href.attr("href"));  
  209.             }  
  210.             Elements srcs = document.select("img[src]");  
  211.             Iterator<Element> srcIter = srcs.iterator();  
  212.             while(srcIter.hasNext()){  
  213.                 Element src = srcIter.next();  
  214.                 urls.add(src.attr("src"));  
  215.             }  
  216.             Elements opts = document.select("option[value]");  
  217.             Iterator<Element> optIter = opts.iterator();  
  218.             while(optIter.hasNext()){  
  219.                 Element opt = optIter.next();  
  220.                 urls.add(opt.attr("value"));  
  221.             }  
  222.             Elements links = document.select("link[href]");  
  223.             Iterator<Element> linkIter = links.iterator();  
  224.             while(linkIter.hasNext()){  
  225.                 Element li =  linkIter.next();  
  226.                 urls.add(li.attr("href"));  
  227.             }  
  228.         } catch (IOException e) {  
  229.             e.printStackTrace();  
  230.         }  
  231.         return urls;  
  232.     }  
  233.       
  234.     /** 
  235.      * 得到html内容和html名称 
  236.      * @param url URL 
  237.      * @return map[html-内容;title-名称] 
  238.      */  
  239.     public Map<String, String> getHtml(String url){  
  240.         Map<String, String> map = new HashMap<String, String>();  
  241.         try {  
  242.             Document document = Jsoup.connect(url).timeout(5000).get();  
  243.             map.put("html", document.html());  
  244.             map.put("title", url.replaceAll("/""").replaceAll(":"""));  
  245.         } catch (IOException e) {  
  246.             System.out.println("This is html has exception [" + url + "]");  
  247.             System.out.println(e.getMessage());  
  248.         }  
  249.         return map;  
  250.           
  251.     }  
  252.       
  253.     /** 
  254.      * URL是否以html结尾 
  255.      * @param url 
  256.      * @return true-是;false-否 
  257.      */  
  258.     public boolean checkURL(String url) {  
  259.         String html = url.substring(url.lastIndexOf(".") + 1);  
  260.         return "html".equals(html) ? true : false;  
  261.     }  
  262.       
  263.     /** 
  264.      * 将html写入本地文件 
  265.      * @param htmlText html内容 
  266.      * @param htmlName html名称 
  267.      */  
  268.     public void getHtmlToLocal(Map<String, String> map){  
  269.         Writer writer = null;  
  270.         try {  
  271.             writer = new OutputStreamWriter(new FileOutputStream(new File(  
  272.                     Constants.HTMLPATH + map.get("title"))), "UTF-8");  
  273.             writer.write(map.get("html"));  
  274.             writer.flush();  
  275.         } catch (FileNotFoundException e) {  
  276.             e.printStackTrace();  
  277.         } catch (IOException e) {  
  278.             e.printStackTrace();  
  279.         } finally {  
  280.             if (writer != null) {  
  281.                 try {  
  282.                     writer.close();  
  283.                 } catch (IOException e) {  
  284.                     e.printStackTrace();  
  285.                 }  
  286.             }  
  287.         }  
  288.     }  
  289.       
  290.     /** 
  291.      * 毫秒转换成hhmmss 
  292.      * @param ms 毫秒 
  293.      * @return hh:mm:ss 
  294.      */  
  295.     public String msToss(long ms) {  
  296.         SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");  
  297.         formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));  
  298.         String ss = formatter.format(ms);  
  299.         return ss;  
  300.     }  
  301.       
  302. }  

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车停在路边限号怎么办 违停的罚单丢了怎么办 借道左转红灯了 怎么办 道路上有锯齿线标志怎么办 被领导臭骂了一顿怎么办 酒驾撞了人逃跑怎么办处理 荣耀9home键掉了怎么办 今天开车把老太婆撞了怎么办 交通责任认定书不合理怎么办 交通事故救济金用了 没钱还怎么办 车脏了洗不干净怎么办 衣服上贴花掉了怎么办 衣服上的画掉了怎么办 衣服上沾了胶怎么办 补鞋胶弄衣服上怎么办 摩托车大灯里面掉漆怎么办 行驶中轮胎爆胎怎么办 左拐车道直行了怎么办 踏板摩托车淋雨打不着火怎么办 购房小蓝本丢了怎么办 3d下载模型没颜色怎么办 车辆被扣30分怎么办 驾驶证被扣15分怎么办 驾驶本被扣分了怎么办 违章扣分扣错了怎么办 出国自驾游怎么办手续 新加坡开车工作遇到坏人怎么办 身份证户口本都丢了怎么办 户口本和身份证都丢了怎么办 网上预约挂完号没收到短信怎么办 驾驶证过了换证期限怎么办 身体弱末梢神经循环不好怎么办 自来水钙镁离子超标怎么办 呼吸感觉有煤烟味是怎么办 酒精弄到衣服上怎么办 孕妇吃了糟卤怎么办 气泡机打不了气怎么办 膝盖好冷好凉怎么办吃什么好 卸妆水进眼睛了怎么办 外出没带卸妆水怎么办? 种睫毛卸睫膏弄眼睛里面了 怎么办