我的学校作业涉及编写一个简单的网络爬虫来爬行维基百科。该作业规定我不能使用任何外部库,因此我一直在使用 java.net.URL 类。基于official tutorial以及我的教授给出的一些代码:
public static void main(String[] args) {
System.setProperty("sun.net.client.defaultConnectTimeout", "500");
System.setProperty("sun.net.client.defaultReadTimeout", "1000");
try {
URL url = new URL(BASE_URL + "/wiki/Physics");
InputStream is = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String inputLine;
int lineNum = 0;
while ((inputLine = br.readLine()) != null && lineNum < 10) {
System.out.println(inputLine);
lineNum++;
}
is.close();
}
catch (MalformedURLException e) {
System.out.println(e.getMessage());
}
catch (IOException e) {
System.out.println(e.getMessage());
}
}
此外,作业要求:
Your program should not continuously send requests to wiki. Your program must wait for at least 1 second after every 10 requests
所以我的问题是,上面的代码中“请求”到底发送到哪里?这种连接是如何运作的?整个网页是一次性加载的吗?还是逐行下载?
老实说,我对网络不太了解,所以如果我误解了一些基本的东西,我很抱歉。任何帮助将不胜感激。
最佳答案
InputStream is = url.openStream();
在上面的行中,您将发送请求
BufferedReader br = new BufferedReader(new InputStreamReader(is));
在这一行获取输入流并读取。
调用 url.openStream() 会启动一个到 URL 解析到的服务器的新 TCP 连接。然后通过连接发送 HTTP GET 请求。如果一切顺利(即 200 OK),服务器会发回 HTTP 响应消息,其中携带在指定 URL 上提供的数据有效负载。然后,您需要从 openStream() 方法返回的 InputStream 中读取字节,以便将数据有效负载检索到您的程序中。
关于java - 从java中的URL读取: when is a request actually sent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47344666/