Java爬虫——jsoup爬取知乎内容并写入文件

引言:利用闲暇时间写了一个小爬虫,巩固Jsoup技术

注:此篇文章仅供学习使用

由于知乎的内容都是比较精彩和权威,网上很多文章也都是关于爬取知乎内容的,所以笔者也写了一个简单的小爬虫来获取知乎的内容

1. 找到需要爬取的页面


                         在这里插入图片描述
2.分析页面数据
                    在这里插入图片描述
3. 找到上诉图片中返回值的请求信息
             在这里插入图片描述
                               在这里插入图片描述
                             在这里插入图片描述
        在这里插入图片描述

 

由上诉图片中我们可以得到请求路径,请求方式,浏览器的用户代理,请求参数,响应体等信息


注:由于当前请求是用get方式,部分请求头信息可以忽略

4.准备环境

  1. pom.xml: (如果不会maven可以手动引入jar包)

         <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>
  1. 根据已经得到的信息编写爬虫
 @Test
    public void zh(){

        try {

            // 封装请求参数
            String json = "{\"include\": \"data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_labeled,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics\",\n" +
                    "\"limit\": 20,\n" + //每列显示的个数
                    "\"offset\": 15,\n" + //页数
                    "\"platform\": \"desktop\",\n" +
                    "\"sort_by\": \"default\"}";
            JSONObject object = JSONObject.parseObject(json);

            // 使用jsoup对url参数发起请求
            Connection connect = Jsoup.connect("https://www.zhihu.com/api/v4/questions/22913650/answers");

            // 将封装的参数放至jsoup 作为发送请求的参数  例:?limit: 20&offset: 15
            for (String key : object.keySet()) {
                connect.data(key,object.get(key).toString());
            }

            // 发起请求并接受响应
            Connection.Response response = connect
                    // 防止 UnsupportedMimeTypeException 异常
                    .ignoreContentType(true)
                    // 伪装
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
                    .execute();

            // 解析响应体
            JSONObject responseJson = JSONObject.parseObject(response.body());
            JSONArray dataArray = JSONArray.parseArray(responseJson.get("data").toString());

            /**
             * 文件io操作
             */

            // 创建 C:\Users\Admin\Desktop 文件夹
            File file = new File("C:\\Users\\Admin\\Desktop");
            if (!file.exists()) {
                file.mkdirs();
            }

            // 创建 C:\Users\Admin\Desktop\zh.txt 文件
            File ZH = new File("C:\\Users\\Admin\\Desktop\\zh.txt");
            if (!ZH.isFile()){
                ZH.createNewFile();
            }

            // 文件输出流&高效输出流  用于将数据写入到指定文件中
            FileWriter fileWriter = new FileWriter(ZH,true);
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

            // 从返回的响应体中过滤想要的数据并写入到文件中
            for (Object data : dataArray) {
                JSONObject dataJO = JSONObject.parseObject(data.toString());
                JSONObject author = JSONObject.parseObject(dataJO.get("author").toString());
                Object authorName = author.get("name");
                Object excerpt = dataJO.get("content");
                Object voteup_count = dataJO.get("voteup_count");
                // 将数据写入缓存区
                bufferedWriter.write(authorName+"("+voteup_count+"人赞同):");
                bufferedWriter.write("\n");
                bufferedWriter.write(excerpt.toString());
                bufferedWriter.write("\n");
                bufferedWriter.write("\n");
                bufferedWriter.write("\n");
            }

            // 刷新   注:将缓存区的数据刷新到文件中
            bufferedWriter.flush();

            // 关流   注:节约资源
            fileWriter.close();
            bufferedWriter.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

返回结果:

读者可以自定义规则将标签过滤

上诉代码可以封装为一个方法,有兴趣可以自行封装

                {\__/}                                          {\__/}
                ( ·-·)                                          (·-· )
                / >------------------------------------------------< \
                         |      ☆                            |
                         |         ☆                         |
                         |  ★                                |
                         |         ☆                         |
                         |      ☆                            |
                         |                                   |
                         -------------------------------------

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用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。 最后,我们可以将提的数据保存到本地或数据库中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值