01 | <font></font> |
002 | package com.zzger.model;<font></font> |
003 | <font></font> |
004 | import java.util.ArrayList;<font></font> |
005 | import java.util.Collections;<font></font> |
006 | import java.util.List;<font></font> |
007 | import java.util.concurrent.CountDownLatch;<font></font> |
008 | <font></font> |
009 | import com.zzger.module.queue.UrlQueue;<font></font> |
010 | import com.zzger.util.HttpUtils;<font></font> |
011 | import com.zzger.util.RegexUtils;<font></font> |
012 | <font></font> |
013 | public class WebSite {<font></font> |
014 | <font></font> |
015 | /**<font></font> |
016 | * 站点url<font></font> |
017 | */ <font></font> |
018 | private String url;<font></font> |
019 | <font></font> |
020 | /**<font></font> |
021 | * 需要爬行的url队列<font></font> |
022 | */ <font></font> |
023 | private UrlQueue<String> urls = new UrlQueue<>();<font></font> |
024 | <font></font> |
025 | /**<font></font> |
026 | * 已爬行过的页面url<font></font> |
027 | */ <font></font> |
028 | private List<String> exitUrls = Collections.synchronizedList( new ArrayList<>());<font></font> |
029 | <font></font> |
030 | private static final int TOTAL_THREADS = 12 ; <font></font> |
031 | <font></font> |
032 | private final CountDownLatch mStartSignal = new CountDownLatch( 1 ); <font></font> |
033 | <font></font> |
034 | private final CountDownLatch mDoneSignal = new CountDownLatch(TOTAL_THREADS); <font></font> |
035 | <font></font> |
036 | public WebSite(String url){<font></font> |
037 | this .url = url;<font></font> |
038 | urls.offer(url); //把网站首页加入需要爬行的队列中<font></font> |
039 | }<font></font> |
040 | <font></font> |
041 | public void guangDu(){<font></font> |
042 | new Thread( new Runnable() {<font></font> |
043 | @Override <font></font> |
044 | public void run() {<font></font> |
045 | paxing(HttpUtils.httpGet(url));<font></font> |
046 | }<font></font> |
047 | }).start();<font></font> |
048 | }<font></font> |
049 | <font></font> |
050 | public void paxing(String html){<font></font> |
051 | if (html.lastIndexOf( "下一页</a></li></ul></div>" )< 0 ) return ;<font></font> |
052 | String strList = html.substring(html.indexOf( "<li class=\\" next-page\\ ">" ), <font></font> |
053 | html.lastIndexOf( "下一页</a></li></ul></div>" ));<font></font> |
054 | String url = RegexUtils.RegexString( "<a href=\\" (.+?)\\ "" , strList);<font></font> |
055 | if (url.equals( "Nothing" )) return ;<font></font> |
056 | urls.put(url); //把url存储到队列中<font></font> |
057 | paxing(HttpUtils.httpGet(url));<font></font> |
058 | }<font></font> |
059 | <font></font> |
060 | public void dxcPx(){<font></font> |
061 | Page<DuanZi> page = new Gxpage(urls.take());<font></font> |
062 | List<Section<DuanZi>> list = page.ybhqSection().getSections();<font></font> |
063 | for (Section<DuanZi> section : list){<font></font> |
064 | new Thread( new Runnable() {<font></font> |
065 | @Override <font></font> |
066 | public void run() {<font></font> |
067 | mStartSignal.countDown(); // 计数减一为0,工作线程真正启动具体操作 <font></font> |
068 | try {<font></font> |
069 | mStartSignal.await(); // 阻塞,等待mStartSignal计数为0运行后面的代码 <font></font> |
070 | // 所有的工作线程都在等待同一个启动的命令 <font></font> |
071 | } catch (InterruptedException e) {<font></font> |
072 | e.printStackTrace();<font></font> |
073 | }<font></font> |
074 | DuanZi duanzi = section.select().getModel();<font></font> |
075 | System.out.println(duanzi.getTitle());<font></font> |
076 | mDoneSignal.countDown(); // 完成以后计数减一 <font></font> |
077 | }<font></font> |
078 | }<font></font> |
079 | ).start();<font></font> |
080 | }<font></font> |
081 | try <font></font> |
082 | { <font></font> |
083 | mDoneSignal.await(); // 等待所有工作线程结束 <font></font> |
084 | } <font></font> |
085 | catch (InterruptedException e) <font></font> |
086 | { <font></font> |
087 | e.printStackTrace(); <font></font> |
088 | } <font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
089 | dxcPx(); //线程任务执行完后,再次获取URL队列进行任务</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> |
090 | }</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
091 | public static void main(String [] args){</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
092 | WebSite web = new WebSite(“ https://www.bdqnhyq.com”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> |
093 | web.guangDu();</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
094 | for ( int i = 0 ; i < 10 ; i ++){</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
095 | 新线程( new Runnable(){</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
096 | @覆盖</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
097 | public void run(){</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
098 | web.dxcPx();</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
099 | }</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
100 | })。开始();</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
101 | }</font></font><font></font> |
102 | <font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
103 | }</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
104 | }</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > |
文章来源: 北大青鸟 开发小组