浅浅谈谈如何利用Javase+多线程+计算机网络的知识做一个爬CSDN阅读量总访问量的程序

目录

我们发现csdn的文章

首先为了印证我们的想法

我们用postman往csdn我们任意一篇文章发起post请求

发送请求

​编辑获得响应结果

我们发现我们的阅读量上涨

PostRequestSender类

但是我们经过测试发现

定义一个字符串数组 把URL放进去

然后延迟启动

在线程池里面设置任务的延迟和每次执行的间隔

主方法代码

博客的阅览量也在增长

然而为了防止被网站监测出来

我们可以采取其他策略

比如说往请求体里面塞一个随机数

注意不要写的太复杂 防止电脑卡爆

个人号推广

博客主页

Web后端开发

Web前端开发

数据库开发

项目实战

算法与数据结构

计算机基础

回忆录


我们发现csdn的文章

只要你点进去

就会增长阅读量

结合我们学习的计算机网络相关知识

不难猜测是只要向网页发送post请求

就能获得一次阅读量的增长。

POST请求是HTTP协议中的一种方法,用于向服务器提交数据,通常用于创建或更新资源,或者执行一些操作,比如提交表单数据、上传文件等。在Web开发中,POST请求比GET请求更安全,因为它将数据包含在请求体中,而不是像GET请求一样在URL中可见。

首先为了印证我们的想法

我们用postman往csdn我们任意一篇文章发起post请求

打开postman

发送请求

获得响应结果

我们发现我们的阅读量上涨

证实了我们的想法

我们只要往文章发送请求就行

利用网络编程的知识

我们写个发起请求的类

PostRequestSender类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Random;

public class PostRequestSender {
    private String url;
    static long ans=0;
    public PostRequestSender(String url) {
        this.url = url;
    }

    public void sendPostRequest() throws IOException {
        // 创建URL对象
        URL obj = new URL(url);

        // 打开连接
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // 设置请求方法为POST
        con.setRequestMethod("POST");

        // 设置请求头

        con.setRequestProperty("User-Agent", "Java client");
        con.setRequestProperty("Content-Type", "application/json");

        // 可选:设置请求体
        Random random=new Random();
        int randomValue = random.nextInt(1000); // 生成一个0到999的随机整数
        String postData = "{\"key1\":\"value1\", \"key2\":\"" + randomValue + "\"}";
        con.setDoOutput(true);
        try (OutputStream os = con.getOutputStream()) {
            byte[] input = postData.getBytes(StandardCharsets.UTF_8);
            os.write(input, 0, input.length);
        }

        // 获取响应
        int responseCode = con.getResponseCode();
        System.out.println("Sending POST request to URL: " + url);
        System.out.println("Response Code: " + responseCode);
        System.out.println("run "+(ans++)+" ...");

        // 读取响应内容
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8))) {
            String inputLine;
            StringBuilder response = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
//            System.out.println("Response Body: " + response.toString());
        }
    }
}

但是我们经过测试发现

在同一时间内连续发送多次post请求

只会记录一次阅读量

这说明

CSDN自带有反爬的程序

我们可以规定在1分钟内依次爬取100篇文章

定义一个字符串数组 把URL放进去

然后延迟启动

利用的是多线程的知识

创建线程池

在线程池里面设置任务的延迟和每次执行的间隔

我们遍历数组

主方法代码

import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {

    public static void main(String[] args) throws Exception {
        String[] urls = {
                "https://blog.csdn.net/qq_30500575/article/details/139987333?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139962431?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139962247?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139926411?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139920678?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139920678?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139904327?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139904250?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139841808?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139841808?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139842155?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139857617?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139857996?spm=1001.2014.3001.5501",
                "https://blog.csdn.net/qq_30500575/article/details/139858097?spm=1001.2014.3001.5501"
                // Add more URLs as needed
        };

        // 创建定时执行的线程池
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

        // 循环访问多个网址,并每隔20秒执行一次
        for (String url : urls) {
            Runnable task = () -> {
                try {
                    PostRequestSender sender = new PostRequestSender(url);
                    sender.sendPostRequest();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            };
            // 初始延迟10秒,每隔50秒执行一次任务
            executor.scheduleAtFixedRate(task, 10, 50, TimeUnit.SECONDS);
        }

        // 等待所有任务完成后关闭线程池
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        executor.shutdown();
    }
}

启动 查看控制台信息

注意联网哦

依次爬取打印

博客的阅览量也在增长

同时还会打印状态码和URL地址

然而为了防止被网站监测出来

我们可以采取其他策略

比如说往请求体里面塞一个随机数

注意不要写的太复杂 防止电脑卡爆

个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值