1. 程式人生 > >網路爬蟲-Socket程式設計

網路爬蟲-Socket程式設計

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重定向錯誤,可能是引數配置的問題,請大家自行研究
    這裡寫圖片描述