java爬虫爬取网站数据实例

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         forint 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;">

文章来源: 北大青鸟 开发小组

猜你喜欢

转载自blog.csdn.net/aide315/article/details/79569546
今日推荐