浅浅谈谈如何利用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

相关推荐
monstercl4 分钟前
Lua中基础函数使用详解
lua·脚本语言
爱的叹息4 分钟前
Spring Boot 集成Redis 的Lua脚本详解
spring boot·redis·lua
暮雨哀尘14 分钟前
微信小程序开发:开发实践
开发语言·算法·微信小程序·小程序·notepad++·性能·技术选型
冷琅辞21 分钟前
Go语言的嵌入式网络
开发语言·后端·golang
response_L22 分钟前
国产系统统信uos和麒麟v10在线打开word给表格赋值
java·c#·word·信创·在线编辑
Cool----代购系统API22 分钟前
跨境速卖通与 API 接口数据分析
开发语言·python
苹果酱056722 分钟前
Golang标准库——runtime
java·vue.js·spring boot·mysql·课程设计
User_芊芊君子28 分钟前
【Java】类和对象
java·开发语言
向宇it34 分钟前
【零基础入门unity游戏开发——2D篇】2D 游戏场景地形编辑器——TileMap的使用介绍
开发语言·游戏·unity·c#·编辑器·游戏引擎
DARLING Zero two♡37 分钟前
C++类间的 “接力棒“ 传递:继承(上)
开发语言·c++·继承·里氏替换原则