做Java爬蟲相比於python較爲複雜一點,python的幾行代碼就可以抓取一個網頁,Java可能需要幾十行甚至跟多,因此從代碼量來看python更具有爬蟲優勢,但是Java也不是不可以做爬蟲,由於我們學習Java基礎語法,爲了鞏固自己的基礎知識,我們可以通過爬蟲來掌握相關知識。
Java的java.net包中還提供了高層次網絡編程類——URL,通過URL類訪問互聯網資源。
一、使用URL類
Java 的java.net.URL類用於請求互聯網上的資源,採用HTTP/HTTPS協議,請求方法是GET方法,一般 是請求靜態的、少量的服務器端數據。
URL類常用構造方法:
- URL(String spec):根據字符串表示形式創建URL對象。
- URL(String protocol, String host, String file):根據指定的協議名、主機名和文件名稱創建URL對 象。
- URL(String protocol, String host, int port, String file):根據指定的協議名、主機名、端口號和文件 名稱創建URL對象。
URL類常用方法:
- InputStream openStream():打開到此URL的連接,並返回一個輸入流。
- URLConnection openConnection():打開到此URL的新連接,返回一個URLConnection對象。
下面介紹一下如何使用java.net.URL類來做簡單的網頁抓取,示例代碼如下:
mport java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author : 蔡政潔
* @email :[email protected]
* @date : 2020/2/21
* @time : 11:04 下午
*/
//Java網絡爬蟲
public class HelloWorld {
public static void main(String[] args) {
// Web網址
String url = "https://www.sina.com.cn/";
URL reqURL = null;
try {
reqURL = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try (
// 打開網絡通信輸入流
InputStream inputStream = reqURL.openStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
){
StringBuilder sb = new StringBuilder();
String line = bufferedReader.readLine();
while (line !=null){
sb.append(line);
sb.append('\n');
line = bufferedReader.readLine();
}
// 日誌輸出
System.out.println(sb);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、使用HttpURLConnection發送GET請求
由於URL類只能發送HTTP/HTTPS的GET方法請求,如果要想發送其他的情況或者對網絡請求有更深入的控制時,可以使用HttpURLConnection類型。
代碼如下:
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;
/**
* @author : 蔡政潔
* @email :[email protected]
* @date : 2020/2/21
* @time : 11:29 下午
*/
public class HelloWorld {
static String urlString = "https://blog.csdn.net/weixin_45366499";
public static void main(String[] args) {
BufferedReader br = null;
HttpURLConnection conn = null;
try {
URL reqURL = new URL(urlString);
// 用reqURL.openConnection()打開一個連接,返回HttpURLConnection對象
conn = (HttpURLConnection) reqURL.openConnection();
// 請求方法設置爲get方法
conn.setRequestMethod("GET");
// 打開網絡通信輸入流
InputStream is = conn.getInputStream();
// 通過is創建InputStreamReader對象
InputStreamReader isr = new InputStreamReader(is,"utf-8");
// 通過isr創建
br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line !=null){
sb.append(line);
sb.append('\n');
line = br.readLine();
}
// 輸出日誌
System.out.println(sb);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (conn != null){
// 斷開連接
conn.disconnect();
}
if (br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三、使用HttpURLConnection發送POST請求
HttpURLConnection也可以發送HTTP/HTTPS的POST請求,下面介紹如何使用HttpURLConnection發送POST請求。
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author : 蔡政潔
* @email :[email protected]
* @date : 2020/2/22
* @time : 6:45 下午
*/
public class HelloWorld {
// web服務網址
static String urlstring = "https://blog.csdn.net/weixin_45366499";
public static void main(String[] args) {
BufferedReader br = null;
HttpURLConnection conn = null;
try {
URL reqURL = new URL(urlstring);
// 用reqURL.openConnection()打開一個連接,返回HttpURLConnection對象
conn = (HttpURLConnection) reqURL.openConnection();
// HTTP請求方法爲POST
conn.setRequestMethod("POST");
// 設置請求過程中可以傳遞參數給服務器
conn.setDoInput(true);
String parm = " ";
// 設置參數
DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream());
dataOutputStream.writeBytes(parm);
dataOutputStream.close();
// 打開網絡通信輸入流
InputStream is = conn.getInputStream();
// 通過is創建 InputStreamReader對象
InputStreamReader isr = new InputStreamReader(is,"utf-8");
// 通過isr創建BufferedReader對象
br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null){
sb.append(line);
sb.append('\n');
line = br.readLine();
}
// 日誌輸出
System.out.println(sb);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (conn != null){
conn.disconnect();
}
if (br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、下載案例
爲了進一步熟悉URL類,介紹一個下載案例程序Downloader。通過下載網上圖片
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author : 蔡政潔
* @email :[email protected]
* @date : 2020/2/22
* @time : 7:55 下午
*/
public class Downloader {
// web服務網址
static String urlString = "http://a3.att.hudong.com/68/61/300000839764127060614318218_950.jpg";
public static void main(String[] args) {
dowmload();
}
private static void dowmload(){
HttpURLConnection conn = null;
try {
// 創建URL對象
URL requrl = new URL(urlString);
// 打開鏈接
conn= (HttpURLConnection) requrl.openConnection();
try (
// 從連接對象獲得輸入流
InputStream is = conn.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
// 創建文件輸出流
OutputStream os = new FileOutputStream("./download.jpg");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(os);
){
byte[] buffer = new byte[1024];
int bytesRead =bufferedInputStream.read(buffer);
while (bytesRead !=-1){
bufferedOutputStream.write(buffer,0,bytesRead);
bytesRead = bufferedInputStream.read(buffer);
}
}catch (IOException e){
e.printStackTrace();
}
System.out.println("下載完成!");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (conn != null){
conn.disconnect();
}
}
}
}
運行結果就是把網上的一張圖片下載到自己的電腦上,有興趣可以試一下。
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!