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()进行解析,解析成功则合法。
程序源码:
- import java.net.InetAddress;
- import java.net.UnknownHostException;
- public class DomainResolver {
- public static void main(String[] args){
- String input = args[0];// 从命令行参数获取用户输入的域名或IP地址
- try{
- InetAddress address = InetAddress.getByName(input);
- // 判断用户输入的参数是IP地址还是域名
- if (isValidIP(input)){
- // 如果是IP地址则反向解析为主机名或域名
- System.out.println("规范主机名:"+address.getCanonicalHostName());
- System.out.println("域名:"+address.getHostName());
- }else{
- // 如果是域名则解析为IP地址
- System.out.println("IP地址:"+address.getHostAddress());
- }
- } catch (UnknownHostException e) {
- System.out.println("不能解析此域名或IP地址");
- e.printStackTrace();
- }
- }
- // 判断是否是合法的IP地址
- public static boolean isValidIP(String ip){
- if (ip == null || ip.isEmpty()){ // ip为空
- return false;
- }
- // 检查是否为IPv4地址
- if(ip.contains(".")){
- String[] parts = ip.split("\\.");
- if(parts.length != 4){
- return false;
- }
- for(String s : parts){
- int i = Integer.parseInt(s);
- if(i<0 || i>255){
- return false;
- }
- }
- return true;
- }
- // 检查是否为IPv6地址
- if(ip.contains(":")){
- // 使用 InetAddress.getByName()方法来判断是否为合法的 IPv6 地址
- try{
- InetAddress.getByName(ip);
- return true;
- }catch (UnknownHostException e){
- return false;
- }
- }
- return false;
- }
- }
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输入流中的内容,并将每行内容写入到本地文件中。
程序源码:
- import java.io.*;
- import java.net.URL;
- import java.net.URLConnection;
- public class WebPageDownloader {
- public static void main(String[] args){
- String urlString = args[0];// 用户输入一个web页面的URL网址
- try{URL url = new URL(urlString);// 创建URL对象
- // 打开URL连接
- URLConnection connection = url.openConnection();
- // 设置HTTP请求的User-Agent头字段,模拟一个浏览器请求
- connection.setRequestProperty("User-Agent","Mozilla/5.0");
- // 获取输入流
- try(BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
- BufferedWriter writer = new BufferedWriter(new FileWriter("webPage.html"))){
- // 读取网页内容并保存到以网页文件格式的本地html文件中
- String content;
- while((content = reader.readLine())!=null){
- writer.write(content);
- writer.newLine();
- }
- }
- System.out.println("网页已成功下载并保存到本地文件wePage.html");
- }catch (IOException e){
- System.out.println("无法下载该网页:" + e.getMessage());
- }
- }
- }
根据以上代码并不能真正地获取网页内容,虽然显示"网页已成功下载并保存到本地文件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无效。
程序源码:
- import java.net.MalformedURLException;
- import java.net.URL;
- public class URLParser {
- public static void main(String[] args){
- // 用户输入一个URL网址
- String urlString = args[0];
- try{
- // 创建URL对象
- URL url = new URL(urlString);
- // 获取URL的各个组成部分
- String protocol = url.getProtocol();
- System.out.println("协议:"+protocol);
- String host = url.getHost();
- System.out.println("主机:"+host);
- int port = url.getPort();
- System.out.println("端口:"+port);
- String path = url.getPath();
- System.out.println("路径:"+path);
- String query = url.getQuery();
- System.out.println("查询参数:"+query);
- String ref = url.getRef();
- System.out.println("引用:"+ref);
- }catch (MalformedURLException e){
- System.out.println("无效的URL网址:"+e.getMessage());
- }
- }
- }
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)
程序源码:
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- import org.jsoup.select.Elements;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.Scanner;
- public class DangdangSearch {
- public static void main(String[] args) {
- // 获取用户输入的商品搜索关键词
- Scanner scanner = new Scanner(System.in);
- System.out.print("请输入搜索关键词:");
- String keyword = scanner.nextLine();
- // 当当网主页 URL
- String dangdangUrl = "http://www.dangdang.com/";
- try {
- // 发送 HTTP GET 请求,获取当当网主页的 HTML 内容
- Document doc = Jsoup.connect(dangdangUrl).get();
- // 在搜索框中填入关键词
- Element searchInput = doc.selectFirst("#key_S");
- searchInput.val(keyword);
- // 提交搜索请求并获取搜索结果页面的 HTML 内容
- Document searchResult = Jsoup.connect(dangdangUrl)
- .data("key", keyword)
- .post();
- // 获取搜索结果页面的 HTML 内容
- String searchResultHtml = searchResult.html();
- // 将搜索结果页面的 HTML 内容保存到本地文件中
- try (BufferedWriter writer = new BufferedWriter(new FileWriter("ddsearchResult.html"))) {
- writer.write(searchResultHtml);
- }
- System.out.println("搜索结果已保存到本地文件 ddsearchResult.html");
- } catch (IOException e) {
- System.out.println("搜索失败:" + e.getMessage());
- }
- }
- }
由搜索结果可以看到搜索失败了,HTTP状态码403表示服务器理解请求,但拒绝执行它。这通常是由于服务器的安全设置或配置问题导致的,表示服务器拒绝了客户端的请求。
遇到403错误通常是因为目标网站设置了防爬虫机制,阻止了爬虫程序的访问。我的程序很可能就是被服务器识别为爬虫程序,因此获取失败了。
解决方法:
- 解决方法是设置合适的请求头信息,通过模拟正常的浏览器访问行为,包括User-Agent、Referer等字段,来避免被服务器识别为爬虫程序。使用Jsoup库中连接对象的userAgent()方法设置User-Agent字段来模拟Chrome浏览器的请求(同题2),referrer()方法设置Referer字段来指明请求的来源(即当当网)。修改后的代码如下:
- import org.jsoup.Connection;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import java.io.BufferedWriter;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
- import java.nio.charset.StandardCharsets;
- import java.nio.file.Files;
- import java.nio.file.Paths;
- import java.util.Scanner;
- public class DangdangSearch {
- public static void main(String[] args) {
- // 接收用户输入的商品搜索关键词
- Scanner scanner = new Scanner(System.in);
- System.out.print("请输入搜索关键词:");
- String keyword = scanner.nextLine();
- // 模拟搜索框,得到当当网搜索结果网址
- String dangDangUrl = "http://search.dangdang.com/?key=" + keyword;
- try { // 设置请求头信息,模拟浏览器请求
- Connection connection = Jsoup.connect(dangDangUrl)
- .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
- .referrer("https://www.dangdang.com/")
- .timeout(10000); // 设置超时时间
- // 获取当前网页内容
- Document doc = connection.get();
- // 打印网页内容
- System.out.println(doc.outerHtml());
- // 将搜索结果页面的HTML内容保存到本地文件中
- try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("ddsearchResult.html"),"GBK"))){
- writer.write(doc.outerHtml());
- }
- System.out.println("搜索结果已保存到本地文件 ddsearchResult.html");
- } catch (IOException e) {
- System.out.println("搜索失败:" + e.getMessage());
- }
- }
- }
标签:java,String,URL,编程,System,获取数据,import,out From: https://blog.csdn.net/gyeolhada/article/details/141758474