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