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

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. }

 

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值