网络爬虫-Socket编程

版权声明:欢迎大家转载,转载请注明原作者和原地址链接,谢谢 https://blog.csdn.net/tiandixuanwuliang/article/details/80796002

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重定向错误,可能是参数配置的问题,请大家自行研究
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/tiandixuanwuliang/article/details/80796002