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

目录

我们发现csdn的文章

首先为了印证我们的想法

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

发送请求

​编辑获得响应结果

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

PostRequestSender类

但是我们经过测试发现

[定义一个字符串数组 把URL放进去](#定义一个字符串数组 把URL放进去)

然后延迟启动

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

主方法代码

博客的阅览量也在增长

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

我们可以采取其他策略

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

[注意不要写的太复杂 防止电脑卡爆](#注意不要写的太复杂 防止电脑卡爆)

个人号推广

博客主页

Web后端开发

Web前端开发

数据库开发

项目实战

算法与数据结构

计算机基础

回忆录


我们发现csdn的文章

只要你点进去

就会增长阅读量

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

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

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

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

首先为了印证我们的想法

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

打开postman

发送请求

获得响应结果

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

证实了我们的想法

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

利用网络编程的知识

我们写个发起请求的类

PostRequestSender类

java 复制代码
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放进去

然后延迟启动

利用的是多线程的知识

创建线程池

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

我们遍历数组

主方法代码

java 复制代码
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

相关推荐
daidaidaiyu4 小时前
一文学习 工作流开发 BPMN、 Flowable
java
ZTLJQ5 小时前
序列化的艺术:Python JSON处理完全解析
开发语言·python·json
l1t5 小时前
DeepSeek总结的 pg_regresql插件:真正可移植的 PostgreSQL 统计信息
数据库·postgresql
oradh5 小时前
Oracle 11.2.0.1版本升级至11.2.0.4_单机环境
数据库·oracle·oracle11g·oracle升级
l1t5 小时前
用docker安装测试crate数据库
数据库·docker·容器·cratedb
2401_891482175 小时前
多平台UI框架C++开发
开发语言·c++·算法
anzhxu5 小时前
QT数据库(三):QSqlQuery使用
数据库·qt·oracle
身如柳絮随风扬5 小时前
MySQL核心知识
数据库·mysql
德彪稳坐倒骑驴5 小时前
Oracle 11g安装
数据库·oracle
SuniaWang5 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构