java爬虫爬取网站数据实例

01<font></font>
002package com.zzger.model;<font></font>
003  <font></font>
004import java.util.ArrayList;<font></font>
005import java.util.Collections;<font></font>
006import java.util.List;<font></font>
007import java.util.concurrent.CountDownLatch;<font></font>
008  <font></font>
009import com.zzger.module.queue.UrlQueue;<font></font>
010import com.zzger.util.HttpUtils;<font></font>
011import com.zzger.util.RegexUtils;<font></font>
012  <font></font>
013public 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;">

文章来源: 北大青鸟 开发小组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值