中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java之爬蟲

發布時間:2020-06-15 23:09:54 來源:網絡 閱讀:1831 作者:水滴的歷程 欄目:軟件技術

近期研究爬蟲爬取網站鏈接:
1.需要獲取所有超鏈接
2.排除已爬取的鏈接,去重
3.爬蟲的廣度和深度方向研究(ps:目前沒有研究徹底)
以下是實現代碼:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.plaf.synth.SynthSpinnerUI;

public class study {
    private static List<String> waitforUrl=new ArrayList<>();//存儲抓取出來的url,等待爬
    private static Set<String> goforUrl=new HashSet<>();//存儲爬過的url
    private static Map<String,Integer> allUrldepth=new HashMap<>();//對所有url進行爬去深度判斷
    private static int Maxdepth=2;
    public static void main(String[] args) {

        String urlstr="............";
        study.gourl(urlstr, 1);

    }

    public static void gourl(String urlstr,int depath) {
        if(!(goforUrl.contains(urlstr)||depath>Maxdepth)) {
            goforUrl.add(urlstr);
            try {
                URL url=new URL(urlstr);
                URLConnection urlConn=url.openConnection();//建立url鏈接
                InputStream is=urlConn.getInputStream();//通過鏈接獲取頁面內容,為字節流
                InputStreamReader isr=new InputStreamReader(is,"utf-8");//將字節流轉化為字符流
                BufferedReader br=new BufferedReader(isr);//讀取字節流

                StringBuffer sb=new StringBuffer();//實例化StringBuffer用來存儲讀取數據
                String line=null;

                while((line=br.readLine())!=null) {
                    sb.append(line);
                    //System.out.println(line);
                    Pattern p = Pattern.compile("<a .*href=.+</a>");
                    Matcher m=p.matcher(line);
                    while(m.find()) {
                        String href=m.group();
                        href=href.substring(href.indexOf("href="));
                        if(href.charAt(5)=='\"'||href.charAt(5)=='\''){
                            href=href.substring(6);
                          }else{
                            href=href.substring(5);
                          }
                        try {
                        href=href.substring(0,href.indexOf("\""));
                        }catch(Exception e) {
                            href=href.substring(0,href.indexOf("\'"));
                        }
                        waitforUrl.add(href);
                        allUrldepth.put(href, depath+1);
                    }
                }

                is.close();//關閉輸出流
                isr.close();//關閉字節流讀取
                br.close();
                System.out.println(urlstr);
                System.out.println("鏈接總數:"+waitforUrl.size()+",已爬去鏈接數:"+goforUrl.size());

            }catch(Exception e){
                 e.printStackTrace();
            }

        }
        //用遞歸的方法繼續爬取其他鏈接
            String nexturl=waitforUrl.get(0);
            waitforUrl.remove(0);
            gourl(nexturl,allUrldepth.get(nexturl));
    }

}

java之爬蟲
遇到的問題:allUrldepth作為hashmap,當key值即url一樣時存在value值即depath被覆蓋問題
解決辦法:通過判斷hashmap里key值是否包含,包含就把原有depath添加進去
if(allUrldepth.containsKey(href)) {
allUrldepth.put(href,depath);
}else {
allUrldepth.put(href, depath+1);
}

問題:通過一個線程執行速度太慢,通過多線程解決

解決辦法:

private static int MAX_THREAD=5;//記錄總線程數5條
private static Object obj=new Object();//Object對象,幫助進行線程的等待操作
public class myThread extends Thread{
        @Override
        public void run() 
        {
            while(true) 
            {
                if(waitforUrl.size()>0) 
                {
                    String url=waitforUrl.get(0);
                    waitforUrl.remove(0);
                    gourl(url, allUrldepth.get(url));
                }else 
                {
                    System.out.println("當前線程準備就緒,等待連接爬取:"+this.getName());
                      //建立一個對象,讓線程進入等待狀態,即wait()
                      synchronized(obj){
                        try{
                          obj.wait();
                        }catch(Exception e){

                        }

                }
            }
        }
    }

java之爬蟲

問題:由于截取的部分a標簽之間同時存在單雙引號,例如www.baidu.com' ><img src="....</a>

解決辦法:改變正則,只截取a標簽前半部分,<a .*href=.+?>使用非貪婪模式獲取

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正镶白旗| 新化县| 溧阳市| 灌南县| 大渡口区| 长顺县| 达孜县| 新化县| 繁昌县| 平山县| 江安县| 毕节市| 龙岩市| 四子王旗| 西和县| 黄石市| 容城县| 乐山市| 海城市| 蓝山县| 西充县| 宜兰县| 泽州县| 香河县| 花垣县| 随州市| 沁阳市| 眉山市| 南澳县| 深圳市| 枞阳县| 德惠市| 德令哈市| 康乐县| 南部县| 武宁县| 崇仁县| 枝江市| 深水埗区| 精河县| 桓台县|