整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Java 如何讀取網頁內容

          得之前在公眾號提過曾經在 T 公司做 Java 爬蟲,有讀者對爬蟲的實現很感興趣。在 Java 應用中讀取遠程 URL 內容是一個比較常見的需求,可以使用 Apache 旗下的開源項目 Httpclient 來實現。


          Httpclient 基于 Java 語言,實現了 HTTP 1.0 和 HTTP 1.1 協議。實現了 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE 等全部方法。支持使用代理建立連接。支持設置最大連接數,同時支持設置每個主機的最大連接數,發現并關閉過期的連接。能夠自動處理 cookie,支持用 KeepAlive 來保持持久連接。


          使用 Httpclient 很簡單,在如下的示例代碼中,分為以下幾個步驟:

          1. 創建 HttpClient 對象,這里使用了默認設置;
          2. 創建請求對象 httpGet,對應一次 get 請求;
          3. 調用 HttpClient.execute 執行一次請求,得到的返回是 response;
          4. 通過 response 可以獲取返回的狀態和HTML內容;
          CloseableHttpClient httpclient = HttpClients.createDefault();
          HttpGet httpGet = new HttpGet("http://www.baidu.com");
          CloseableHttpResponse response = httpclient.execute(httpGet);
          try {
              System.out.println(response.getStatusLine());
              HttpEntity entity = response.getEntity();
              System.out.println(EntityUtils.toString(entity));
          } finally {
              response.close();
          }


          發送 get 請求,需要創建 HttpGet 請求。發送 post 請求,需要創建 HttpPost 請求。如果是帶參數的請求,可以直接拼接在 URL 中,也可以使用 URIBuilder 創建對象然后通過 addParameter 或 setParameter 方法添加 。如果需要設置請求 header,可以調用 addHeader 或 setHeader 方法設置 header。


          對于 post 請求,可以調用 setEntity 方法設置請求的數據。如 post.setEntity(new StringEntity(body, "utf-8"))。支持提交多種數據:

          • StringEntity:純文本內容,比如提交 json 數據;
          • FileEntity:文件,比如文件上傳;
          • ByteArrayEntity:字節流數據,比如提交序列化數據;
          • UrlEncodedFormEntity:表單數據,比如提交 form 表單;
          • InputStreamEntity:輸入流數據,比如文件上傳;
          • SerializableEntity:序列化數據,支持提交 Serializable 序列化對象;
          • BasicHttpEntity:通用數據,使用者自行寫入流和內容長度。


          調用 HttpClient 的 execute 方法發送請求,返回的是一個 HttpResponse 對象。通過該對象可以獲取返回的所有數據:

          • getStatusLine:獲取返回狀態 StatusLine 對象,如 HTTP/1.1 200 OK;
          • getEntity:獲取返回的內容,如 HTML 數據;
          • getHeaders / getAllHeaders:獲取返回的 header 內容;


          設置請求參數

          HttpClient 支持設置 RequestConfig 來配置請求默認參數。一般使用 RequestConfig.Builder 來構建 RequestConfig。Builder 支持進行如下設置:

          • setProxy:設置代理服務器,需要傳入 HttpHost 對象;
          • setLocalAddress:設置本地地址;
          • setCookieSpec:設置 cookie 處理策略;
          • setRedirectsEnabled:設置是否允許自動跳轉,處理 302 等響應;
          • setMaxRedirects:設置最大跳轉數量,302 跳轉次數;
          • setAuthenticationEnabled:設置是否啟用認證,如啟用需要提供密碼;
          • setConnectionRequestTimeout:設置連接請求超時時間,指從連接池獲取連接的timeout;
          • setConnectTimeout:設置連接超時時間,指客戶端和服務器建立連接的timeout;
          • setSocketTimeout:設置 socket 時間,指客戶端從服務器讀取數據的timeout;

          RequestConfig 構建后,需要調用 HttpClient setDefaultRequestConfig 方法設置到客戶端中。


          使用代理

          通過 RequestConfig.setProxy 可以設置請求的代理,在爬蟲等場景非常實用。代理的對象類型是 HttpHost,一般設置代理的 ip 和端口。如果代理有密碼,可以使用 CredentialsProvider 配置用戶名和密碼自動完成認證。

          CredentialsProvider credsProvider = new BasicCredentialsProvider();
          //使用密碼的代理端口
          credsProvider.setCredentials(new AuthScope(null,port),
          //用戶名和密碼
          new UsernamePasswordCredentials(username,password)
          );
          httpClientBuilder.setDefaultCredentialsProvider(credsProvider);


          支持 HTTPS 協議

          請求 HTTPS 需要在 HttpClient 中設置 ssl 協議。主要分為以下幾個步驟:

          1. 創建 SSL 協議上下文 SSLContext,通常使用 SSLContextBuilder 構建;
          2. 創建 SSLConnectionSocketFactory,是 TLS/SSL 連接的 socket 工廠;
          3. 向連接工廠中注冊 https 協議使用 SSLConnectionSocketFactory 處理;
          4. 創建連接池管理器 PoolingHttpClientConnectionManager,并注冊 HTTPS;
          5. 向 HttpClient 設置連接池管理器。

          如果請求報錯 HTTPS 證書問題,可以設置忽略證書。設置系統變量 System.setProperty("jsse.enableSNIExtension", "false"); 即可。

          // 需要通過以下代碼聲明對https連接支持
          SSLContext sslcontext = SSLContexts.custom()
              .loadTrustMaterial(null, new TrustSelfSignedStrategy())
              .build();
          // SSL 連接工廠
          SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);
          Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
              .<ConnectionSocketFactory> create()
              .register("http",PlainConnectionSocketFactory.getSocketFactory())
              .register("https", sslsf).build();
          // 初始化連接管理器
          PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
          client = HttpClients.custom()
              .setConnectionManager(poolConnManager)
              .build();


          推薦閱讀

          30 個 Spring 常用注解與差異總結

          又到黃金季節,該跳槽嗎?怎么跳?

          分布式事務 6 個技術方案

          15 個 MyBatis 技巧,趕緊收藏吧!

          你的工資被倒掛了嗎

          絡爬蟲基本思路

          基本思路:由關鍵字指定的url把所有相關的html頁面全抓下來(html即為字符串),然后解析html文本(通常是正則表達式或者現成工具包如jsoup),提取文本信息,然后把文本信息存儲起來。

          網絡爬蟲操作步驟

          URL(統一資源定位符)

          下載資源

          分析下載資源(正則表達式)

          抽取、清洗、儲存

          該文章只會操作兩步步驟URL和下載html資源。

          網絡編程小知識

          URI:(Universal Resource Identifier)統一資源標記符,用來標記抽象或物理資源的一個緊湊字符串。

          URL:(Universal Resource Locator)統一資源定位符,一種定位資源的主要訪問機制的字符串,一個標準的URL必須包括:protocal(協議)、host(主機)、port(端口號)、path(路徑)、parameter(參數)、anchor(錨)。

          URN:(Universal Resource Name)統一資源名稱,通過特定命名空間中的唯一名稱或ID來標識資源。

          URL和URN都是URI,但是URI不一定是URL或者URN。

          SEO搜索引擎優化

          SEO是搜索引擎優化(Search Engine Optimization)的英文縮寫,中文譯為“搜索引擎優化”。在了解搜索引擎自然排名機制的基礎上,對網站進行內部及外部的調整優化,改進網站在搜索引擎中的關鍵詞自然排名,獲得更多流量,從而達成網站銷售及品牌建設的預期目標。

          網絡爬蟲技術是SEO搜索引擎優化的基礎(對網絡爬蟲感興趣的同學可以深入研究)

          JAVA中的JDK已經對URL(資源定位符)封裝完畢,使用者只要會用即可。

          使用JAVA代碼下載網站資源有如下兩種情況:


          該代碼主要是通過URL類的openStream方法來獲取網絡資源,如果還想了解URL類的信息的同學可以去看看JDK中URL類的源代碼。

          二、網站不允許外來訪問(模仿瀏覽器使用HTTP協議交流)代碼如下


          注意事項

          JAVA中的控制臺儲存空間有限,所以有時候HTML源代碼會顯示不全,但你可以通過IO操作來拷貝到文件中去。

          HttpURLConnection類的setRequestProperty方法中的(String key,String value)參數需要到瀏覽器相應網頁中去拷貝。

          拷貝如下:

          1、進入瀏覽器相關網頁。

          2、按住F12進入devtools。

          3、拷貝Request包中最后一行數據。

          4、冒號前的對應key參數,冒號后的對應value參數。

          點擊關注私信小編“資源”即可獲得

          了編寫一個Java爬蟲,你需要了解以下幾個步驟:

          1. 首先,你需要確定你要抓取的網站。可以從瀏覽器中復制網站的URL并粘貼到你的Java代碼中。
          2. 接下來,你需要使用Java的網絡編程API連接到該網站。你可以使用URLConnection或HttpClient等庫。
          3. 一旦你建立了一個連接,你就可以開始讀取網頁內容。你可以使用Java的IO庫讀取網頁。
          4. 在讀取網頁內容之后,你需要解析網頁以提取所需的信息。這可以使用Java的解析器,如Jsoup或XML解析器。
          5. 最后,你需要存儲或使用所提取的信息。你可以將信息保存到數據庫中,將其輸出到文件中,或將其用于其他用途。

          下面是一個基本的Java爬蟲代碼示例,它使用Jsoup解析器和URLConnection庫連接到目標網站并提取標題和鏈接信息:

          import java.io.IOException;
          import java.net.URL;
          import java.net.URLConnection;
          import java.util.Scanner;
          
          import org.jsoup.Jsoup;
          import org.jsoup.nodes.Document;
          import org.jsoup.nodes.Element;
          import org.jsoup.select.Elements;
          
          public class SimpleWebCrawler {
            
            public static void main(String[] args) {
              String url = "https://www.example.com/";
              try {
                URLConnection conn = new URL(url).openConnection();
                conn.addRequestProperty("User-Agent", "Mozilla/5.0");
                Scanner scanner = new Scanner(conn.getInputStream());
                String html = scanner.useDelimiter("\\Z").next();
                scanner.close();
                Document doc = Jsoup.parse(html);
                Elements links = doc.select("a[href]");
                for (Element link : links) {
                  System.out.println(link.attr("href") + " - " + link.text());
                }
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          }
          

          Jsoup

          Jsoup是一款用于解析HTML和XML文檔的Java庫。它提供了類似于jQuery的語法來操作文檔,使得解析和處理文檔變得非常簡單。

          以下是Jsoup解析器的一些常用功能:

          1. 解析HTML文檔:使用Jsoup可以輕松解析HTML文檔,并且可以處理各種標簽、屬性、文本內容等。
          2. 獲取元素:可以使用類似于jQuery的選擇器語法來獲取HTML文檔中的元素,例如獲取所有的鏈接、圖片等。
          3. 修改元素:可以使用Jsoup修改HTML文檔中的元素,例如修改元素的屬性、添加或刪除元素等。
          4. 過濾HTML文檔:可以使用Jsoup過濾HTML文檔中的不必要的元素,例如過濾掉廣告、統計代碼等。
          5. 處理字符編碼:可以使用Jsoup來處理HTML文檔中的字符編碼,例如將文檔中的ISO-8859-1編碼轉換為UTF-8編碼等。
          6. 支持HTTPS:Jsoup還支持使用HTTPS協議獲取HTML文檔,可以使用它來爬取一些需要登錄才能訪問的網站。

          總之,Jsoup是一款非常實用的HTML和XML解析器,可以幫助Java開發者快速、簡單地解析和處理HTML文檔,使得爬蟲開發變得更加容易。

          Jsoup的使用

          使用Jsoup解析器需要先將其添加到項目的依賴中。可以通過Maven或者Gradle來添加依賴。

          例如,使用Maven添加Jsoup的依賴:

          <dependency>
              <groupId>org.jsoup</groupId>
              <artifactId>jsoup</artifactId>
              <version>1.14.3</version>
          </dependency>

          添加依賴之后,就可以在Java代碼中使用Jsoup了。以下是使用Jsoup解析器獲取HTML文檔中所有鏈接的示例代碼:

          import org.jsoup.Jsoup;
          import org.jsoup.nodes.Document;
          import org.jsoup.nodes.Element;
          import org.jsoup.select.Elements;
          
          public class JsoupExample {
              public static void main(String[] args) {
                  String html = "<html><head><title>Jsoup Example</title></head>"
                          + "<body><p>Jsoup is a Java library for working with real-world HTML.</p>"
                          + "<a href=\"http://example.com\">Example</a></body></html>";
          
                  Document doc = Jsoup.parse(html); // 將HTML字符串解析為文檔對象
          
                  Elements links = doc.select("a"); // 獲取所有的鏈接元素
          
                  for (Element link : links) {
                      String href = link.attr("href"); // 獲取鏈接的URL地址
                      String text = link.text(); // 獲取鏈接的文本內容
                      System.out.println(href + ": " + text);
                  }
              }
          }
          

          以上代碼使用Jsoup將HTML字符串解析為文檔對象,然后使用選擇器語法獲取所有的鏈接元素,并輸出它們的URL地址和文本內容。

          除此之外,Jsoup還有很多其他的功能,例如修改元素、過濾HTML文檔等等,可以根據具體需求靈活運用。

          Jsoup 解析器的常見功能和代碼片段示例

          1.獲取網頁的 Title:

          Document doc = Jsoup.connect("http://example.com/").get();
          String title = doc.title();

          2.獲取指定標簽的文本內容:

          Element element = doc.select("div.content").first();
          String text = element.text();

          3.獲取指定屬性的值:

          Element element = doc.select("img").first();
          String src = element.attr("src");

          4.過濾 HTML 標簽:

          String html = "<p>這是一段 <b>加粗</b> 的文本。</p>";
          String text = Jsoup.parse(html).text();

          5.修改 HTML 內容:

          Element element = doc.select("div.content").first();
          element.append("<p>這是新增的文本內容。</p>");

          6.提取網頁中的鏈接:

          Elements links = doc.select("a[href]");
          for (Element link : links) {
              String href = link.attr("href");
              System.out.println(href);
          }

          7.提取網頁中的圖片:

          Elements imgs = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]");
          for (Element img : imgs) {
              String src = img.attr("src");
              System.out.println(src);
          }

          這些只是 Jsoup 解析器的常見用法之一。Jsoup 還有更多的功能,如解析 XML、處理表單、處理 Cookie 等,大家可以自己去了解!

          有不足之處大家也可以在評論區指出!


          主站蜘蛛池模板: 一区二区三区福利视频| 国产一区二区三区在线2021| 亚洲av无码片vr一区二区三区| 亚洲美女视频一区二区三区| 精品一区二区三区在线播放| 精品一区二区在线观看| 亚洲性日韩精品国产一区二区| 无码一区二区三区AV免费| 精品乱人伦一区二区三区| 国产成人精品一区在线| 国产一区二区三区免费视频| 国产精品日韩欧美一区二区三区| 久久精品道一区二区三区| 色妞AV永久一区二区国产AV| 精品人妻一区二区三区四区在线| 亚洲国产一区二区三区在线观看| 日韩国产精品无码一区二区三区 | 日韩精品一区二区三区国语自制| 亚洲AV日韩AV天堂一区二区三区| 精品aⅴ一区二区三区| 制服中文字幕一区二区 | 亚洲无码一区二区三区| 蜜臀AV一区二区| 亚洲国产韩国一区二区| 成人免费观看一区二区| 亚洲一区免费视频| 亚洲日本va一区二区三区| 中文字幕日韩精品一区二区三区| 日本免费一区二区在线观看| 韩国福利影视一区二区三区| 国产自产对白一区| 国产成人精品视频一区| 日韩精品无码人妻一区二区三区| 波多野结衣精品一区二区三区 | 亚拍精品一区二区三区| 中文乱码字幕高清一区二区| 无码人妻精品一区二区蜜桃 | 亚洲一区二区无码偷拍| 日本一区二区三区在线看| 一级毛片完整版免费播放一区 | 国产亚洲3p无码一区二区|