首页 > 编程语言 >互联网编程:实验三 域名IP转换及应用URL类定位和获取数据编程

互联网编程:实验三 域名IP转换及应用URL类定位和获取数据编程

时间:2024-09-02 09:52:12浏览次数:13  
标签:java String URL 编程 System 获取数据 import out

1.编程解析域名:

编写一个可重用的域名解析程序模块,使之能够将用户输入的域名解析为IP地址,能将用户输入的IP地址,反向解析为对应的主机名或域名。

思路:

  • 通过命令行参数args[0]获取用户输入的域名或IP地址。
  • 使用InetAddress.getByName(args[0])用于获取相应的 InetAddress 对象。
  • 判断用户输入的参数是IP地址还是域名。
  • 如果是域名,则使用getHostAddress()解析为IP地址,并输出IP地址。
  • 如果是IP地址,则使用getCanonicalHostName()和getHostName()反向解析为主机名或域名,并输出规范主机名和域名,
  • 对于判断是否是合法IP地址:先判断是IPv4地址还是IPv6地址,如果都不是则不是合法地址。如果是IPv4,则按字符串点号分割成四部分,对每一部分判断是否在合法范围;如果是IPv6,则使用InetAddress.getByName()进行解析,解析成功则合法。

程序源码:

  1. import java.net.InetAddress;
  2. import java.net.UnknownHostException;
  3. public class DomainResolver {
  4.     public static void main(String[] args){
  5.         String input = args[0];// 从命令行参数获取用户输入的域名或IP地址
  6.         try{
  7.             InetAddress address = InetAddress.getByName(input);
  8.             // 判断用户输入的参数是IP地址还是域名
  9.             if (isValidIP(input)){
  10.                 // 如果是IP地址则反向解析为主机名或域名
  11.                 System.out.println("规范主机名:"+address.getCanonicalHostName());
  12.                 System.out.println("域名:"+address.getHostName());
  13.             }else{
  14.                 // 如果是域名则解析为IP地址
  15.                 System.out.println("IP地址:"+address.getHostAddress());
  16.             }
  17.         } catch (UnknownHostException e) {
  18.             System.out.println("不能解析此域名或IP地址");
  19.             e.printStackTrace();
  20.         }
  21.     }
  22.     // 判断是否是合法的IP地址
  23.     public static boolean isValidIP(String ip){
  24.         if (ip == null || ip.isEmpty()){ // ip为空
  25.             return false;
  26.         }
  27.         // 检查是否为IPv4地址
  28.         if(ip.contains(".")){
  29.             String[] parts = ip.split("\\.");
  30.             if(parts.length != 4){
  31.                 return false;
  32.             }
  33.             for(String s : parts){
  34.                 int i = Integer.parseInt(s);
  35.                 if(i<0 || i>255){
  36.                     return false;
  37.                 }
  38.             }
  39.             return true;
  40.         }
  41.         // 检查是否为IPv6地址
  42.         if(ip.contains(":")){
  43.             // 使用 InetAddress.getByName()方法来判断是否为合法的 IPv6 地址
  44.             try{
  45.                 InetAddress.getByName(ip);
  46.                 return true;
  47.             }catch (UnknownHostException e){
  48.                 return false;
  49.             }
  50.         }
  51.         return false;
  52.     }
  53. }

2.编程下载一个web页面:

编写程序,用户输入一个web页面的URL网址,程序会将该URL网址所指向的web页面内容下载到本地显示,并将网页内容以网页文件格式保存到指定磁盘位置。

编写程序,用户输入一个URL网址,程序能够分析该URL,显示输出该URL的各组成部分。

思路:

  • 通过命令行参数获取用户输入的一个Web网页的URL地址。
  • 创建一个URL对象,使用用户输入的URL网址作为参数。
  • 使用URL对象的openConnection()方法打开URL连接,返回一个URLConnextion对象,表示与URL之间的连接。
  • 通过URLConnection对象设置HTTP请求的User-Agent头字段,来模拟一个浏览器请求,即使用connection.setRequestProperty(“User-Agent”,“Mozilla/5.0”)
  • 创建BufferedReader对象来读取URLConnection的输入流中的内容和创建BufferedWriter对象来将读取到的网页内容写入到本地文件webPage.html中。
  • 通过while循环逐行读取URLConnection输入流中的内容,并将每行内容写入到本地文件中。

程序源码:

  1. import java.io.*;
  2. import java.net.URL;
  3. import java.net.URLConnection;
  4. public class WebPageDownloader {
  5.     public static void main(String[] args){
  6.         String urlString = args[0];// 用户输入一个web页面的URL网址
  7.         try{URL url = new URL(urlString);// 创建URL对象
  8.             // 打开URL连接
  9.             URLConnection connection = url.openConnection();
  10.             // 设置HTTP请求的User-Agent头字段,模拟一个浏览器请求
  11.             connection.setRequestProperty("User-Agent","Mozilla/5.0");
  12.             // 获取输入流
  13.             try(BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  14.                 BufferedWriter writer = new BufferedWriter(new FileWriter("webPage.html"))){
  15.                 // 读取网页内容并保存到以网页文件格式的本地html文件中
  16.                 String content;
  17.                 while((content = reader.readLine())!=null){
  18.                     writer.write(content);
  19.                     writer.newLine();
  20.                 }
  21.             }
  22.             System.out.println("网页已成功下载并保存到本地文件wePage.html");
  23.         }catch (IOException e){
  24.             System.out.println("无法下载该网页:" + e.getMessage());
  25.         }
  26.     }
  27. }

根据以上代码并不能真正地获取网页内容,虽然显示"网页已成功下载并保存到本地文件wePage.html"的获取成功信息,但是该代码是在 try-catch 块之外执行的。这意味着即使在 try 块中出现了异常,导致无法下载网页内容,catch 块捕获到异常后,仍会执行 try-catch 块之后的代码,因此会打印出成功提示,但实际上并没有成功获取网页内容。

经过查询学习,因为很多网站对请求的 User-Agent 进行了检查,如果请求中没有提供合适的 User-Agent 字段,服务器可能会认为该请求不是来自于正常的浏览器,而是来自于爬虫程序或者是其他非法访问,于是拒绝服务或者返回错误内容。

解决方法:

  • connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");

使用这个代码,这个代码设置了User-Agent字段为模拟Chrome浏览器的请求头信息,包括浏览器版本、操作系统等,来模拟正常的浏览器访问行为,使服务器认为这个请求是来自于一个真实的浏览器。

同样再次运行输入https://www.baidu.com,保存成功后,打开webPage.html。获取页面内容成功。

3.编程分解URL:

思路:

  • 通过命令行参数获取用户输入的一个URL地址。
  • 创建一个URL对象,使用用户输入的URL网址作为参数。
  • 使用URL对象的getProtocol()方法获取协议,getHost()方法获取主机名,getPort()方法获取端口,getPath()方法获取路径,getQuery()方法获取查询参数,getRef()方法获取引用。将获取到的URL各个组成部分打印到控制台。
  • 在捕获到MalformedURLException异常时,输出错误消息URL无效。

程序源码:

  1. import java.net.MalformedURLException;
  2. import java.net.URL;
  3. public class URLParser {
  4.     public static void main(String[] args){
  5.         // 用户输入一个URL网址
  6.         String urlString = args[0];
  7.         try{
  8.             // 创建URL对象
  9.             URL url = new URL(urlString);
  10.             // 获取URL的各个组成部分
  11.             String protocol = url.getProtocol();
  12.             System.out.println("协议:"+protocol);
  13.             String host = url.getHost();
  14.             System.out.println("主机:"+host);
  15.             int port = url.getPort();
  16.             System.out.println("端口:"+port);
  17.             String path = url.getPath();
  18.             System.out.println("路径:"+path);
  19.             String query = url.getQuery();
  20.             System.out.println("查询参数:"+query);
  21.             String ref = url.getRef();
  22.             System.out.println("引用:"+ref);
  23.         }catch (MalformedURLException e){
  24.             System.out.println("无效的URL网址:"+e.getMessage());
  25.         }
  26.     }
  27. }

4.编程完成一次当当网购物网站的购物搜索:

当当购物网站主页是http://www.dangdang.com/,如下图1所示,该主页有一个用于搜索商品的表单,在浏览器浏览打开主页情景下,用户可以在搜索关键字输入框中输入商品关键字,点击“搜索”按钮,会返回搜索结果页面。比如输入“洗衣机”关键字,点击“搜索”按钮,会返回如图2所示搜索结果页面。

思路:

  • 获取用户输入的搜索关键字。
  • 使用Jsoup库模拟用户访问当当购物网站主页。使用Jsoup的connect()方法向当当网主页发送HTTP GET请求,并通过get()方法获取响应的HTML内容,放在主页文档doc中。
  • 在获取到的主页文档中通过HTML元素Element的id属性找到搜索框,并使用val()方法填入用户输入的关键字。
  • 使用Jsoup的connect()方法发送HTTP POST请求,提交搜索请求,然后通过post()方法获取响应的HTML内容获取搜索结果页面。
  • 将搜索结果页面HTML源码打印出来,并保存到本地文件ddsearchResult.html中。(ddsearchResult.html也就是题干中的productResult.html)

程序源码:

  1. import org.jsoup.Jsoup;
  2. import org.jsoup.nodes.Document;
  3. import org.jsoup.nodes.Element;
  4. import org.jsoup.select.Elements;
  5. import java.io.BufferedWriter;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8. import java.util.Scanner;
  9. public class DangdangSearch {
  10.     public static void main(String[] args) {
  11.         // 获取用户输入的商品搜索关键词
  12.         Scanner scanner = new Scanner(System.in);
  13.         System.out.print("请输入搜索关键词:");
  14.         String keyword = scanner.nextLine();
  15.         // 当当网主页 URL
  16.         String dangdangUrl = "http://www.dangdang.com/";
  17.         try {
  18.             // 发送 HTTP GET 请求,获取当当网主页的 HTML 内容
  19.            Document doc = Jsoup.connect(dangdangUrl).get();
  20.             // 在搜索框中填入关键词
  21.             Element searchInput = doc.selectFirst("#key_S");
  22.             searchInput.val(keyword);
  23.             // 提交搜索请求并获取搜索结果页面的 HTML 内容
  24.             Document searchResult = Jsoup.connect(dangdangUrl)
  25.                     .data("key", keyword)
  26.                     .post();
  27.             // 获取搜索结果页面的 HTML 内容
  28.             String searchResultHtml = searchResult.html();
  29.             // 将搜索结果页面的 HTML 内容保存到本地文件中
  30.             try (BufferedWriter writer = new BufferedWriter(new FileWriter("ddsearchResult.html"))) {
  31.                 writer.write(searchResultHtml);
  32.             }
  33.            System.out.println("搜索结果已保存到本地文件 ddsearchResult.html");
  34.         } catch (IOException e) {
  35.             System.out.println("搜索失败:" + e.getMessage());
  36.        }
  37.    }
  38. }

由搜索结果可以看到搜索失败了,HTTP状态码403表示服务器理解请求,但拒绝执行它。这通常是由于服务器的安全设置或配置问题导致的,表示服务器拒绝了客户端的请求。

遇到403错误通常是因为目标网站设置了防爬虫机制,阻止了爬虫程序的访问。我的程序很可能就是被服务器识别为爬虫程序,因此获取失败了。

解决方法:

  • 解决方法是设置合适的请求头信息,通过模拟正常的浏览器访问行为,包括User-Agent、Referer等字段,来避免被服务器识别为爬虫程序。使用Jsoup库中连接对象的userAgent()方法设置User-Agent字段来模拟Chrome浏览器的请求(同题2),referrer()方法设置Referer字段来指明请求的来源(即当当网)。修改后的代码如下:
  1. import org.jsoup.Connection;
  2. import org.jsoup.Jsoup;
  3. import org.jsoup.nodes.Document;
  4. import java.io.BufferedWriter;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.OutputStreamWriter;
  8. import java.nio.charset.StandardCharsets;
  9. import java.nio.file.Files;
  10. import java.nio.file.Paths;
  11. import java.util.Scanner;
  12. public class DangdangSearch {
  13.     public static void main(String[] args) {
  14.         // 接收用户输入的商品搜索关键词
  15.         Scanner scanner = new Scanner(System.in);
  16.         System.out.print("请输入搜索关键词:");
  17.         String keyword = scanner.nextLine();
  18.         // 模拟搜索框,得到当当网搜索结果网址
  19.         String dangDangUrl = "http://search.dangdang.com/?key=" + keyword;
  20.         try { // 设置请求头信息,模拟浏览器请求
  21.             Connection connection = Jsoup.connect(dangDangUrl)
  22.                     .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
  23.                     .referrer("https://www.dangdang.com/")
  24.                     .timeout(10000); // 设置超时时间
  25.             // 获取当前网页内容
  26.             Document doc = connection.get();
  27.             // 打印网页内容
  28.             System.out.println(doc.outerHtml());
  29.             // 将搜索结果页面的HTML内容保存到本地文件中
  30.             try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("ddsearchResult.html"),"GBK"))){
  31.                 writer.write(doc.outerHtml());
  32.             }
  33.             System.out.println("搜索结果已保存到本地文件 ddsearchResult.html");
  34.         } catch (IOException e) {
  35.             System.out.println("搜索失败:" + e.getMessage());
  36.         }
  37.     }
  38. }

 

标签:java,String,URL,编程,System,获取数据,import,out
From: https://blog.csdn.net/gyeolhada/article/details/141758474

相关文章

  • 【编程规范具体案例(基于Qt、微软、谷歌和AUTOSAR C++14 参考)】 C++ 编码规范 之程序设
    目录标题基本元素3.1类和结构体3.1.1\[必须]使用恰当的访问修饰符来管理类成员的可见性3.1.2\[必须]在类中合理使用默认的特殊成员函数3.1.3\[必须]提供清晰且尽可能一致的类接口3.1.4\[建议]优先使用初始化列表来初始化类成员3.1.5\[建议]使用抽......
  • 【愚公系列】《AIGC辅助软件开发》002-AI智能化编程助手:GitHub Copilot
    ......
  • Java异步编程:CompletableFuture与Future的对比
    Java异步编程:CompletableFuture与Future的对比大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,异步编程是一种常见的编程范式,用于提高应用程序的响应性和吞吐量。Java提供了多种异步编程工具,其中Future和CompletableFuture是两个重要的接口。......
  • 深入理解Java内存模型:对并发编程的影响
    深入理解Java内存模型:对并发编程的影响大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java并发编程中,内存模型是一个至关重要的概念,它定义了程序中各个变量的访问规则,以及在多线程环境下如何正确地处理这些变量。Java内存模型(JMM)是Java规范中定义的......
  • 探索Java中的Lambda表达式:函数式编程的实践
    探索Java中的Lambda表达式:函数式编程的实践大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java8引入了Lambda表达式,这标志着Java语言正式支持了函数式编程。Lambda表达式提供了一种简洁的方式来表示只有一个方法的接口,即所谓的函数式接口。本文将深......
  • Shell编程:一篇讲透数组全知识点
    文章目录数组数组参数的使用$*$@$#数组展开示例数组定义方法数组包含的数据类型获取数组长度读取特定索引的值数组遍历数组切片数组替换删除数组追加数组元素插入数组元素向函数传递数组参数数组在Bash脚本中,数组是一种存储多个元素的变量结构,可以使用不同的......
  • 编程实现“ls -l 文件名”功能
    目录题目思想代码题目编程实现“ls-l文件名”功能思想首先定义了一个 structstat 类型的变量 st ,用于存储文件的状态信息。检查通过 stat 函数获取指定文件(argv[1])的状态信息是否成功。如果获取失败(返回值小于0),通过 perror 输出错误信息并返回......
  • 基于元神操作系统编程写USB扇区
    1.背景本文介绍了“调用元神操作系统API向U盘扇区写数据”的程序实现及测试结果。2.方法(1)调用元神操作系统API读U盘扇区本部分内容已在前面的文章中进行介绍,详细内容请参考“编写程序调用元神操作系统的API”。(2)调用元神操作系统API写U盘扇区本例通过调用系统API来向U......
  • 如何用GPT进行编程辅助?
    随着人工智能技术的迅速发展,GPT(生成型预训练模型)已成为开发者的得力助手之一。无论是编写代码、调试、生成文档,还是解决编程问题,GPT都能提供显著帮助。这篇教程将详细介绍如何使用GPT进行编程辅助,并提供具体的操作步骤和案例。一、为什么选择GPT进行编程辅助?1.快速生成代......
  • 章10——面向对象编程(高级部分)——类名类方法
    类变量/静态(static)变量/静态属性特点:由该类的全体对象实例共享,该变量只占同一块内存空间。其标志是关键字static修饰。在类加载的时候便生成了。类加载的时机如下图:publicstaticintcount=0;类变量可以由类名来访问。System.out.println("共有"+Child.count+"......