爬虫jsoup怎么抓取网页信息

目录

一、导入依赖

题外:

二、实现。

1.写一个工具类,类里面封装方法。传入url地址。

2. 找到你getElementById定位到你想要抓取的地方。

三、获取链接里面的文章内容。

 四、去重

五、保存在数据库

六、总结


各位小伙伴好!最近研究了一下用jsoup来抓取网页。也是小有心得。记录一下怕自己以后忘了。

首先先我们要先明白jsoup是什么,这边简单介绍一下。(详细请移步官网学习:http://jsoup.org/

官方网站是这样说的:jsoup是一个用于处理现实世界HTML的Java库。它提供了一个非常方便的API,用于获取URL以及提取和操作数据,使用最好的HTML5 DOM方法和CSS选择器。

说白了就是一款 Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

具体看怎么用的。

一、导入依赖

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>

题外:

我们的需求是抓取网页。抓取网页的标题、文章内容、图片、链接。

请不要违法犯罪。

二、实现。

1.写一个工具类,类里面封装方法。传入url地址。

public class JsoupUtils {
public List<CrawlContent> parseCj(String url) throws Exception {
    //String url = "http://xxxx";
    LinkedHashMap<String, CrawlContent> contentMap = new LinkedHashMap<>(); // 使用LinkedHashMap保持插入顺序
    //根据url地址获取document网页内容。可以打印一下document.html();并且设置超时时间
    Document document = Jsoup.parse(new URL(url), 30000);

}

}

2. 找到你getElementById定位到你想要抓取的地方。

可以通过找到你要抓取的网页——鼠标右键——检查,找到对应的容器。

 

public class JsoupUtils {

    public List<CrawlContent> parseCj(String url) throws Exception {
        //String url = "http://xxx";
        LinkedHashMap<String, CrawlContent> contentMap = new LinkedHashMap<>(); // 使用LinkedHashMap保持插入顺序
        //根据url地址获取document网页内容。可以打印一下document.html();并且设置超时时间
        Document document = Jsoup.parse(new URL(url), 30000);
        //定位
        Element listData = document.getElementById("listData");
        Elements elements = listData.getElementsByTag("div");
        for (Element el : elements) {
            //获取标题
            String span = el.getElementsByTag("span").eq(0).text();
            //获取链接
            String attr = el.getElementsByTag("a").eq(0).attr("href");
            //链接不是已http开头就拼接
            if (!attr.startsWith("http")) {
                attr = ("http://www.scsjzyxh.cn" + attr);
            }
            //检查标题或链接是否已存在
            if (contentMap.containsKey(span) || contentMap.containsKey(attr)) {
                continue; // 跳过重复数据
            }
            //打印标题
            System.out.println(span);
            //打印链接
            System.out.println(attr);
            //创建CrawlContent对象
            CrawlContent crawlContent = new CrawlContent();
            crawlContent.setTitle(span);
            crawlContent.setConnect(attr);
    }
}

 其实你可以打印你一下找到没有。

三、获取链接里面的文章内容。

思路是刚才document循环里面循环传入链接,并且根据链接定位具体你想获取的内容。

public class JsoupUtils {

    public List<CrawlContent> parseCj(String url) throws Exception {
        //String url = "http://xxx";
        LinkedHashMap<String, CrawlContent> contentMap = new LinkedHashMap<>(); // 使用LinkedHashMap保持插入顺序
        //根据url地址获取document网页内容。可以打印一下document.html();并且设置超时时间
        Document document = Jsoup.parse(new URL(url), 30000);
        //定位
        Element listData = document.getElementById("listData");
        Elements elements = listData.getElementsByTag("div");
        for (Element el : elements) {
            //获取标题
            String span = el.getElementsByTag("span").eq(0).text();
            //获取链接
            String attr = el.getElementsByTag("a").eq(0).attr("href");
            //链接不是已http开头就拼接
            if (!attr.startsWith("http")) {
                attr = ("http://www.scsjzyxh.cn" + attr);
            }
            //检查标题或链接是否已存在
            if (contentMap.containsKey(span) || contentMap.containsKey(attr)) {
                continue; // 跳过重复数据
            }
            //打印标题
            System.out.println(span);
            //打印链接
            System.out.println(attr);
            //创建CrawlContent对象
            CrawlContent crawlContent = new CrawlContent();
            crawlContent.setTitle(span);
            crawlContent.setConnect(attr);

             //放防止有404链接
            try {
                //传入刚才获取的文章链接
                Document contentDocument = Jsoup.parse(new URL(attr), 30000);
                // 提取clearfix文章来源内容
                StringBuilder contentBuilder = new StringBuilder();
                //根据select选择器找到clearfix容器列表的p标签
                Elements contentElements1 = contentDocument.select(".clearfix p");
                for (Element contentElement : contentElements1) {
                    //可以打印一下看拿到了没有
                    System.out.println(contentElement.html());
                    //去重。去多余空格,去多余分隔符。
                    contentBuilder.append(contentElement.text().trim()).append("\n");
                }
                crawlContent.setTextContent(contentBuilder.toString());
              } catch (IOException e) {
                System.out.println("获取链接内容时发生错误:" + attr);
                // 在这里可以进行适当的异常处理,比如记录日志或跳过该链接的处理
                continue; // 跳过当前循环迭代,继续处理下一个链接
            }

    }
}

 四、去重

为了保证我们的数据一致性

我们需要用set去重。

public class JsoupUtils {

    public List<CrawlContent> parseCj(String url) throws Exception {
        //String url = "http://xxx";
        LinkedHashMap<String, CrawlContent> contentMap = new LinkedHashMap<>(); // 使用LinkedHashMap保持插入顺序
        //根据url地址获取document网页内容。可以打印一下document.html();并且设置超时时间
        Document document = Jsoup.parse(new URL(url), 30000);
        //定位
        Element listData = document.getElementById("listData");
        Elements elements = listData.getElementsByTag("div");
        for (Element el : elements) {
            //获取标题
            String span = el.getElementsByTag("span").eq(0).text();
            //获取链接
            String attr = el.getElementsByTag("a").eq(0).attr("href");
            //链接不是已http开头就拼接
            if (!attr.startsWith("http")) {
                attr = ("http://www.scsjzyxh.cn" + attr);
            }
            //检查标题或链接是否已存在
            if (contentMap.containsKey(span) || contentMap.containsKey(attr)) {
                continue; // 跳过重复数据
            }
            //打印标题
            System.out.println(span);
            //打印链接
            System.out.println(attr);
            //创建CrawlContent对象
            CrawlContent crawlContent = new CrawlContent();
            crawlContent.setTitle(span);
            crawlContent.setConnect(attr);

             //放防止有404链接
            try {
                //传入刚才获取的文章链接
                Document contentDocument = Jsoup.parse(new URL(attr), 30000);
                // 提取clearfix文章来源内容
                StringBuilder contentBuilder = new StringBuilder();
                //根据select选择器找到clearfix容器列表的p标签
                Elements contentElements1 = contentDocument.select(".clearfix p");
                for (Element contentElement : contentElements1) {
                    //可以打印一下看拿到了没有
                    System.out.println(contentElement.html());
                    //去重。去多余空格,去多余分隔符。
                    contentBuilder.append(contentElement.text().trim()).append("\n");
                }
                crawlContent.setTextContent(contentBuilder.toString());
              } catch (IOException e) {
                System.out.println("获取链接内容时发生错误:" + attr);
                // 在这里可以进行适当的异常处理,比如记录日志或跳过该链接的处理
                continue; // 跳过当前循环迭代,继续处理下一个链接
            }
        
              removeDuplicates(contentArrayList); // Remove duplicates from the list
            return contentArrayList;
    }

    /**
     * 去重
     * @param contentList
     */
    private void removeDuplicates(List<CrawlContent> contentList) {
        Set<String> uniqueKeys = new HashSet<>();
        List<CrawlContent> uniqueContentList = new ArrayList<>();

        for (CrawlContent content : contentList) {
            String key = content.getTitle() + content.getConnect();
            if (!uniqueKeys.contains(key)) {
                uniqueKeys.add(key);
                uniqueContentList.add(content);
            }
        }
        contentList.clear();
        contentList.addAll(uniqueContentList);
    }
}

 这样我们的工具类就写完了。

五、保存在数据库

可以写一个测试类也可以业务层调用

传入url地址。

使用批量添加方法添加。

@SpringBootTest(classes = JsoupdemoApplication.class)
@RunWith(SpringRunner.class)
public class CrawlContentTest {
    @Autowired
    private CrawlContentMapper contentMapper;

    @Test
    public void Test() throws Exception{
        List<CrawlContent> crawlContents = new JsoupUtils().parseCj("http://xxx");
        contentMapper.insertBatch(crawlContents);
    }
}

效果:

六、总结

jsoup里面有很多document里面有很多api

跟前端js里面的document一样。还是比较容易入门的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java编写基于HttpClient和Jsoup爬虫,需要进行以下步骤: 1. 首先,导入HttpClient和Jsoup的依赖包。可以使用maven或gradle进行依赖管理。 2. 创建一个HttpClient实例,用于发送HTTP请求和接收响应。可以使用HttpClients.createDefault()方法创建一个默认配置的实例。 3. 创建一个HttpGet实例,设置请求URL和请求头信息。可以使用new HttpGet(url)方法创建一个HttpGet实例,然后使用setHeader()方法设置请求头信息。 4. 发送HTTP请求,并获取响应结果。可以使用HttpClient.execute()方法发送请求,并使用HttpResponse.getEntity()方法获取响应实体。 5. 解析HTML内容。可以使用Jsoup.parse()方法解析HTML内容,然后使用Jsoup提供的API进行内容提取和处理。 以下是一个使用HttpClient和Jsoup进行网页爬取的示例代码: ```java import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.IOException; public class WebCrawler { public static void main(String[] args) throws IOException { // 创建一个HttpClient实例 HttpClient httpClient = HttpClients.createDefault(); // 创建一个HttpGet实例,设置请求URL和请求头信息 HttpGet httpGet = new HttpGet("https://www.example.com"); httpGet.setHeader("User-Agent", "Mozilla/5.0"); // 发送HTTP请求,并获取响应结果 HttpResponse httpResponse = httpClient.execute(httpGet); String html = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); // 解析HTML内容 Document document = Jsoup.parse(html); String title = document.title(); System.out.println("Title: " + title); } } ``` 在这个示例中,我们使用HttpClient发送了一个GET请求到https://www.example.com,并获取了响应结果。然后使用Jsoup解析HTML内容,并获取网页的标题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值