项目实训:jsoup爬取favicon以及网页内容(jsoup)

jsoup爬取favicon以及网页内容

任务

由于使用selenium爬取网页的信息有限,所以在本项目环境中使用jsoup进行扩展,如爬取网页的图标。最重要的是ai不能直接对url进行访问,进行实时的数据采集,所以采用jsoup对相应网站的内容进行爬取。

jsoup介绍

Jsoup 是一个用于处理 HTML 解析、提取和操作的 Java 库。它提供了一种简单、方便且灵活的方式来获取和操作 HTML 文档中的数据,类似于 Python 中的 Beautiful Soup 库。Jsoup 能够处理 HTML 的解析、选择器查询(类似于 CSS 选择器)、数据提取和修改等操作,使得开发者可以轻松地从网页中提取数据或者修改网页内容。

主要功能包括:

HTML 解析和DOM 操作: Jsoup 可以将 HTML 字符串解析为 DOM 树,从而可以方便地遍历和操作 DOM 结构。
选择器查询: 支持类似于 CSS 选择器的语法,可以根据标签名、类名、ID、属性等条件来选择指定的元素。
数据提取: 可以从 HTML 文档中提取指定的数据,比如获取特定标签的内容、属性的值等。
HTML 清洁和格式化: Jsoup 提供了清理不规范的 HTML 代码并格式化输出的功能,使得处理来自不同源的 HTML 数据更加简单和一致。
Jsoup 在 Java 开发中被广泛用于网页爬取、数据抓取、数据清洗等领域,它的简洁性和易用性使得处理复杂的 HTML 结构变得更加高效和可靠。

  1. 安装依赖

            <dependency>
                <!-- jsoup HTML parser library @ https://jsoup.org/ -->
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.17.2</version>
            </dependency>
    
  2. 编写
    代码定义了一个简单的 Java 类 WebContent,用于存储和获取网页内容的基本信息,通过构造方法初始化标题和favicon的URL,并通过公共方法提供对这些信息的访问。

    public class WebContent {
        private final String title;
        private final String faviconUrl;
    
        public WebContent(String title,String faviconUrl) {
            this.title = title;
            this.faviconUrl=faviconUrl;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getFaviconUrl() {
            return faviconUrl;
        }
    }
    

    title:私有的字符串变量,用于存储网页的标题。
    faviconUrl:私有的字符串变量,用于存储网站的favicon的URL地址。
    public WebContent(String title, String faviconUrl):类的构造方法,用于实例化 WebContent 对象并初始化其成员变量 title 和 faviconUrl。在构造方法中,传入的 title 和 faviconUrl 参数被分配给类的私有变量 this.title 和 this.faviconUrl。
    public String getTitle():公共方法,用于返回当前 WebContent 对象的标题(即 title 成员变量的值)。
    public String getFaviconUrl():公共方法,用于返回当前 WebContent 对象的网站favicon的URL地址(即 faviconUrl 成员变量的值)。

  3. 爬虫程序
    使用 Jsoup 库来从指定的 URL 获取网页内容,并进行一些处理。

    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import java.io.IOException;
    
    
    public class Spider {
    
        public static WebContent fetchTitleAndImages(String url) {
            try {
                Document doc = Jsoup.connect(url).get();
                if(url.contains("bilibili")){
                    return new WebContent("B站","https://www.baijingapp.com/uploads/product/16511192803960/165111928035679.png");
                }else if(url.contains("csdn")){
                    return new WebContent("CSDN","https://g.csdnimg.cn/static/logo/favicon32.ico");
                }else{
                    Element icon = doc.selectFirst("link[rel~=(shortcut|icon)]");
                    String faviconUrl = icon!=null? icon.absUrl("href"):"https://www.baidu.com/favicon.ico";
                    return new WebContent("CSDN",faviconUrl);//获取favicon
                }
            } catch (IOException e) {
                //e.printStackTrace();
                System.out.println("爬虫失败了!!!!!");
                if(url.contains("bilibili")){
                    return new WebContent("B站","https://www.baijingapp.com/uploads/product/16511192803960/165111928035679.png");
                }else if(url.contains("csdn")){
                    return new WebContent("CSDN","https://g.csdnimg.cn/static/logo/favicon32.ico");
                }else{
                    return new WebContent("失败了","https://www.baidu.com/favicon.ico"); // 或者抛出异常,根据具体需求
                }
            }
        }
        public static String fetchInfo(String url){
            String result="";
            try {
                String cleanUrl=url.substring(0,url.indexOf("%"));
                Document doc = Jsoup.connect(cleanUrl).get();
    
                Elements paragraphs = doc.select("p");
                            for (Element paragraph : paragraphs) {
                                // 打印所有段落的内容
                                result+= paragraph.text();
                                }
            }catch(IOException e){
                e.printStackTrace();
            }
            if(result.length()>700)
            return result.substring(0,700);
            else{
                return result;
            }
        }
    
    }
    
    

首先导入所需的类库,例如Jsoup,IOException等:
Jsoup:导入 Jsoup 库,用于处理 HTML 解析和网页内容获取。
Document:导入 Jsoup 的 Document 类,表示整个 HTML 文档。
Element;Elements:导入 Jsoup 的 Element 类,表示 HTML 元素。
IOException:导入 Java 标准库中的 IOException,用于处理网络连接和读取时可能出现的异常。
然后定义 Spider 类,Spider 类是主要的爬虫类,包含了两个静态方法用于不同的网络数据抓取任务。
方法:
fetchTitleAndImages 方法
功能:fetchTitleAndImages 方法根据传入的 url 参数获取网页的标题和网站的 favicon 图片 URL。

异常处理:使用 try-catch 块捕获可能的 IOException,通常是网络连接问题或者网页不存在等情况。

在 try 块中使用 Jsoup.connect(url).get() 获取指定 url 的网页内容,并将结果存储在 Document 对象 doc 中。
根据 url 的内容判断是哪个网站(这里以 “bilibili” 和 “csdn” 为例),分别返回预设的网站名称和 favicon URL。

如果不是预设的网站,则通过 doc.selectFirst(“link[rel~=(shortcut|icon)]”) 查找网页中的 favicon URL,如果找不到则使用默认的百度 favicon。

在 catch 块中打印爬虫失败的消息,并根据 url 的内容返回对应的预设失败信息或者默认的百度 favicon URL。

fetchInfo 方法
功能:fetchInfo 方法根据传入的 url 参数获取网页的文本内容,并返回处理后的结果字符串。

异常处理:同样使用 try-catch 块捕获可能的 IOException 异常。

在 try 块中使用 Jsoup.connect(cleanUrl).get() 获取经过处理的 cleanUrl 的网页内容,并将结果存储在 Document 对象 doc 中。

使用 doc.select(“p”) 获取所有的 <p> 标签元素,然后遍历这些元素并将每个段落的文本内容添加到 result 字符串中。

在 catch 块中打印异常的堆栈信息。

这是使用 Jsoup 库来进行简单的网页内容抓取和处理。fetchTitleAndImages 方法根据 URL 获取网页标题和 favicon 图片的 URL,根据不同的网站返回不同的预设信息或者尝试获取网页中的真实数据;fetchInfo 方法则获取指定 URL 页面中所有 <p> 标签的文本内容,并对结果进行简单的截断处理。

  1. 进行展示
    图标内容

    图标展示

  2. 内容展示
    文件上传扩展
    文件上传扩展

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Jsoup爬取分页数据的步骤如下: 1. 定义要爬取的网页地址和需要爬取的内容。 2. 使用Jsoup连接网页,获取网页内容。 3. 使用Jsoup解析网页内容,提取需要的数据。 4. 如果网页中存在多页数据,使用循环遍历所有网页,重复步骤2和步骤3。 5. 将提取的数据保存到本地或数据库中。 下面是一个示例代码,演示如何使用Jsoup爬取分页数据: ```java import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class PageCrawler { public static void main(String[] args) throws IOException { // 定义要爬取的网页地址和需要爬取的内容 String url = "https://example.com/page/1"; String cssSelector = ".list-item"; // 使用Jsoup连接网页,获取网页内容 Document doc = Jsoup.connect(url).get(); // 使用Jsoup解析网页内容,提取需要的数据 Elements items = doc.select(cssSelector); for (Element item : items) { // 处理每个数据项 String title = item.select(".title").text(); String description = item.select(".description").text(); System.out.println(title); System.out.println(description); System.out.println("------------"); } // 如果网页中存在多页数据,使用循环遍历所有网页 for (int i = 2; i <= 10; i++) { String nextUrl = "https://example.com/page/" + i; doc = Jsoup.connect(nextUrl).get(); items = doc.select(cssSelector); for (Element item : items) { // 处理每个数据项 String title = item.select(".title").text(); String description = item.select(".description").text(); System.out.println(title); System.out.println(description); System.out.println("------------"); } } // 将提取的数据保存到本地或数据库中 // ... } } ``` 在示例代码中,我们首先定义了要爬取的网页地址和需要爬取的内容。 然后,我们使用Jsoup连接网页,获取网页内容,并使用Jsoup解析网页内容,提取需要的数据。 如果网页中存在多页数据,我们使用循环遍历所有网页,重复步骤2和步骤3。 最后,我们可以将提取的数据保存到本地或数据库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值