国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - Java爬蟲實戰抓取一個網站上的全部鏈接

Java爬蟲實戰抓取一個網站上的全部鏈接

2020-06-24 11:39pangfc JAVA教程

這篇文章主要介紹了JAVA使用爬蟲抓取網站網頁內容的方法,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。

前言:寫這篇文章之前,主要是我看了幾篇類似的爬蟲寫法,有的是用的隊列來寫,感覺不是很直觀,還有的只有一個請求然后進行頁面解析,根本就沒有自動爬起來這也叫爬蟲?因此我結合自己的思路寫了一下簡單的爬蟲。

一 算法簡介

程序在思路上采用了廣度優先算法,對未遍歷過的鏈接逐次發起GET請求,然后對返回來的頁面用正則表達式進行解析,取出其中未被發現的新鏈接,加入集合中,待下一次循環時遍歷。

具體實現上使用了Map<String, Boolean>,鍵值對分別是鏈接和是否被遍歷標志。程序中使用了兩個Map集合,分別是:oldMap和newMap,初始的鏈接在oldMap中,然后對oldMap里面的標志為false的鏈接發起請求,解析頁面,用正則取出<a>標簽下的鏈接,如果這個鏈接未在oldMap和newMap中,則說明這是一條新的鏈接,同時要是這條鏈接是我們需要獲取的目標網站的鏈接的話,我們就將這條鏈接放入newMap中,一直解析下去,等這個頁面解析完成,把oldMap中當前頁面的那條鏈接的值設為true,表示已經遍歷過了。

最后是當整個oldMap未遍歷過的鏈接都遍歷結束后,如果發現newMap不為空,則說明這一次循環有新的鏈接產生,因此將這些新的鏈接加入oldMap中,繼續遞歸遍歷,反之則說明這次循環沒有產生新的鏈接,繼續循環下去已經不能產生新鏈接了,因為任務結束,返回鏈接集合oldMap

二 程序實現

上面相關思路已經說得很清楚了,并且代碼中關鍵地方有注釋,因此這里就不多說了,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package action;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebCrawlerDemo {
 public static void main(String[] args) {
    WebCrawlerDemo webCrawlerDemo = new WebCrawlerDemo();
    webCrawlerDemo.myPrint("http://www.zifangsky.cn");
  }
 
  public void myPrint(String baseUrl) {
    Map<String, Boolean> oldMap = new LinkedHashMap<String, Boolean>(); // 存儲鏈接-是否被遍歷
                                      // 鍵值對
    String oldLinkHost = ""; //host
 
    Pattern p = Pattern.compile("(https?://)?[^/\\s]*"); //比如:http://www.zifangsky.cn
    Matcher m = p.matcher(baseUrl);
    if (m.find()) {
      oldLinkHost = m.group();
    }
 
    oldMap.put(baseUrl, false);
    oldMap = crawlLinks(oldLinkHost, oldMap);
    for (Map.Entry<String, Boolean> mapping : oldMap.entrySet()) {
      System.out.println("鏈接:" + mapping.getKey());
 
    }
 
  }
 
  /**
   * 抓取一個網站所有可以抓取的網頁鏈接,在思路上使用了廣度優先算法
   * 對未遍歷過的新鏈接不斷發起GET請求,一直到遍歷完整個集合都沒能發現新的鏈接
   * 則表示不能發現新的鏈接了,任務結束
   *
   * @param oldLinkHost 域名,如:http://www.zifangsky.cn
   * @param oldMap 待遍歷的鏈接集合
   *
   * @return 返回所有抓取到的鏈接集合
   * */
  private Map<String, Boolean> crawlLinks(String oldLinkHost,
      Map<String, Boolean> oldMap) {
    Map<String, Boolean> newMap = new LinkedHashMap<String, Boolean>();
    String oldLink = "";
 
    for (Map.Entry<String, Boolean> mapping : oldMap.entrySet()) {
      System.out.println("link:" + mapping.getKey() + "--------check:"
          + mapping.getValue());
      // 如果沒有被遍歷過
      if (!mapping.getValue()) {
        oldLink = mapping.getKey();
        // 發起GET請求
        try {
          URL url = new URL(oldLink);
          HttpURLConnection connection = (HttpURLConnection) url
              .openConnection();
          connection.setRequestMethod("GET");
          connection.setConnectTimeout(2000);
          connection.setReadTimeout(2000);
 
          if (connection.getResponseCode() == 200) {
            InputStream inputStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream, "UTF-8"));
            String line = "";
            Pattern pattern = Pattern
                .compile("<a.*?href=[\"']?((https?://)?/?[^\"']+)[\"']?.*?>(.+)</a>");
            Matcher matcher = null;
            while ((line = reader.readLine()) != null) {
              matcher = pattern.matcher(line);
              if (matcher.find()) {
                String newLink = matcher.group(1).trim(); // 鏈接
                // String id="codetool">

三 最后的測試效果

Java爬蟲實戰抓取一個網站上的全部鏈接

PS:其實用遞歸這種方式不是太好,因為要是網站頁面比較多的話,程序運行時間長了對內存的消耗會非常大

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
308
主站蜘蛛池模板: 玖玖操 | 午夜精品美女久久久久av福利 | 欧美成人高清视频 | 国产一区视频在线看 | 天堂v在线视频 | 精品一区二区久久久久黄大片 | 亚洲午夜激情 | 欧美大片免费高清观看 | 成年人免费在线播放视频 | 国产精品一区二区不卡 | 最新av在线 | 欧美日本韩国一区二区三区 | 精品视频在线视频 | 免费看a | 欧美日韩久久精品 | 国产欧美一区二区视频 | 亚洲一区二区av | 成年人免费观看网站 | 三区在线 | 久久精品亚洲精品国产欧美kt∨ | 国产一区二区三区在线观看网站 | 国产欧美久久久久久 | 午夜在线小视频 | 91久久精品国产91久久 | 亚洲 欧美 自拍偷拍 | 一级a毛片 | 精品久久久久香蕉网 | 亚洲视频一区二区 | 午夜电影网站 | 精品国产欧美一区二区三区成人 | 国产欧美精品一区二区色综合 | 亚洲欧美日韩国产 | 色吊丝在线永久观看最新版本 | 成人精品视频一区二区三区 | 91视频在线 | 九色国产| 色爱av| 免费在线观看黄色网址 | 亚洲视频在线观看 | 日韩成人免费 | 成人爽a毛片一区二区免费 成年人毛片视频 |
    <kbd id="61611"><td id="61611"></td></kbd>
    <pre id="61611"></pre><sup id="61611"></sup>
    1. <s id="61611"><optgroup id="61611"><ul id="61611"></ul></optgroup></s>