得之前在公眾號提過曾經在 T 公司做 Java 爬蟲,有讀者對爬蟲的實現很感興趣。在 Java 應用中讀取遠程 URL 內容是一個比較常見的需求,可以使用 Apache 旗下的開源項目 Httpclient 來實現。
Httpclient 基于 Java 語言,實現了 HTTP 1.0 和 HTTP 1.1 協議。實現了 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE 等全部方法。支持使用代理建立連接。支持設置最大連接數,同時支持設置每個主機的最大連接數,發現并關閉過期的連接。能夠自動處理 cookie,支持用 KeepAlive 來保持持久連接。
使用 Httpclient 很簡單,在如下的示例代碼中,分為以下幾個步驟:
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"))。支持提交多種數據:
調用 HttpClient 的 execute 方法發送請求,返回的是一個 HttpResponse 對象。通過該對象可以獲取返回的所有數據:
設置請求參數
HttpClient 支持設置 RequestConfig 來配置請求默認參數。一般使用 RequestConfig.Builder 來構建 RequestConfig。Builder 支持進行如下設置:
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 協議。主要分為以下幾個步驟:
如果請求報錯 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爬蟲,你需要了解以下幾個步驟:
下面是一個基本的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是一款用于解析HTML和XML文檔的Java庫。它提供了類似于jQuery的語法來操作文檔,使得解析和處理文檔變得非常簡單。
以下是Jsoup解析器的一些常用功能:
總之,Jsoup是一款非常實用的HTML和XML解析器,可以幫助Java開發者快速、簡單地解析和處理HTML文檔,使得爬蟲開發變得更加容易。
使用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文檔等等,可以根據具體需求靈活運用。
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 等,大家可以自己去了解!
有不足之處大家也可以在評論區指出!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。