欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络爬虫-Socket编程

程序员文章站 2024-01-19 11:27:58
...

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,但是他们的原理是一样的):
网络爬虫-Socket编程
网络爬虫-Socket编程
分析上面图片:
其中最主要的是Request URL、请求方式、Host和USer-Agent的配置,和我们代码中的写法其实是对应的。另外为了完全模拟浏览器请求,可以把Request Headers中所有参数都写上,并且设置不使用Cookie。
上面代码是最基础的Socket操作,在对www.itcast.cn网站进行Get请求时,程序成功获取数据,如下图,但是在向csdn发送时会报一个301重定向错误,大家可以自行研究。

  • 爬取www.itcast.cn,成功获取到数据
    网络爬虫-Socket编程

  • 爬取csdn时报了一个301重定向错误,可能是参数配置的问题,请大家自行研究
    网络爬虫-Socket编程