網路爬蟲-Socket程式設計
阿新 • • 發佈:2018-12-26
Socket是java進行網路程式設計的基礎,眾多的開源工具都是基於它開發的。本文將使用Socket進行網路程式設計,模擬瀏覽器進行Get和Post請求。
程式碼
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class SendSocket {
private static String domain = "www.itcast.cn" ;
public static void main(String[] args) throws Exception {
testGet();
// testPost();
}
public static void testGet() throws Exception {
Socket socket = new Socket(domain, 80);//設定域名和埠
System.out.println("網路連線成功:" + socket.isConnected());// 檢驗連線是否成功
OutputStream outputStream = socket.getOutputStream();//從socket中獲取outputStream後,再往裡面寫資料
StringBuffer add = new StringBuffer();
add.append("GET / HTTP/1.1\r\n");
add.append("HOST: " + domain + "\r\n");
add.append("User-Agent: "+"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36\r\n");
add.append("\r\n" );//一定要加換行(這是頁面上的換行)
System.out.println("get請求是:" + add.toString());
outputStream.write(add.toString().getBytes());
outputStream.flush();
InputStream inputStream = socket.getInputStream();//輸出流用來接收伺服器端返回的資料
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
//關閉
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
outputStream.close();
socket.close();
}
public static void testPost() throws Exception {
Socket socket = new Socket(domain, 80);
System.out.println("網路連線成功:" + socket.isConnected());// 檢驗連線是否成功
OutputStream outputStream = socket.getOutputStream();
StringBuffer add = new StringBuffer();
add.append("POST / HTTP/1.1\r\n");
add.append("HOST: " + "127.0.0.1"+ "\r\n");
add.append("\r\n");
add.append("username=張三");//這裡可以攜帶資料
add.append("\r\n");
System.out.println("get請求是:" + add.toString());
outputStream.write(add.toString().getBytes());
outputStream.flush();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
outputStream.close();
socket.close();
}
}
總結
首先請看一張瀏覽器請求的圖(下面圖是csdn的,我的程式碼是itcast,但是他們的原理是一樣的):
分析上面圖片:
其中最主要的是Request URL、請求方式、Host和USer-Agent的配置,和我們程式碼中的寫法其實是對應的。另外為了完全模擬瀏覽器請求,可以把Request Headers中所有引數都寫上,並且設定不使用Cookie。
上面程式碼是最基礎的Socket操作,在對www.itcast.cn網站進行Get請求時,程式成功獲取資料,如下圖,但是在向csdn傳送時會報一個301重定向錯誤,大家可以自行研究。
爬取www.itcast.cn,成功獲取到資料
爬取csdn時報了一個301重定向錯誤,可能是引數配置的問題,請大家自行研究