码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 浅浅谈谈如何利用Javase+多线程+计算机网络的知识做一个爬CSDN阅读量总访问量的程序


    目录

    我们发现csdn的文章

    首先为了印证我们的想法

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

    发送请求

    ​编辑获得响应结果

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

    PostRequestSender类

    但是我们经过测试发现

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

    然后延迟启动

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

    主方法代码

    博客的阅览量也在增长

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

    我们可以采取其他策略

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

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

    个人号推广

    博客主页

    Web后端开发

    Web前端开发

    数据库开发

    项目实战

    算法与数据结构

    计算机基础

    回忆录


    我们发现csdn的文章

    只要你点进去

    就会增长阅读量

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

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

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

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

    首先为了印证我们的想法

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

    打开postman

    发送请求

    获得响应结果

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

    证实了我们的想法

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

    利用网络编程的知识

    我们写个发起请求的类

    PostRequestSender类

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. import java.io.OutputStream;
    5. import java.net.HttpURLConnection;
    6. import java.net.URL;
    7. import java.nio.charset.StandardCharsets;
    8. import java.util.Random;
    9. public class PostRequestSender {
    10. private String url;
    11. static long ans=0;
    12. public PostRequestSender(String url) {
    13. this.url = url;
    14. }
    15. public void sendPostRequest() throws IOException {
    16. // 创建URL对象
    17. URL obj = new URL(url);
    18. // 打开连接
    19. HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    20. // 设置请求方法为POST
    21. con.setRequestMethod("POST");
    22. // 设置请求头
    23. con.setRequestProperty("User-Agent", "Java client");
    24. con.setRequestProperty("Content-Type", "application/json");
    25. // 可选:设置请求体
    26. Random random=new Random();
    27. int randomValue = random.nextInt(1000); // 生成一个0到999的随机整数
    28. String postData = "{\"key1\":\"value1\", \"key2\":\"" + randomValue + "\"}";
    29. con.setDoOutput(true);
    30. try (OutputStream os = con.getOutputStream()) {
    31. byte[] input = postData.getBytes(StandardCharsets.UTF_8);
    32. os.write(input, 0, input.length);
    33. }
    34. // 获取响应
    35. int responseCode = con.getResponseCode();
    36. System.out.println("Sending POST request to URL: " + url);
    37. System.out.println("Response Code: " + responseCode);
    38. System.out.println("run "+(ans++)+" ...");
    39. // 读取响应内容
    40. try (BufferedReader in = new BufferedReader(
    41. new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8))) {
    42. String inputLine;
    43. StringBuilder response = new StringBuilder();
    44. while ((inputLine = in.readLine()) != null) {
    45. response.append(inputLine);
    46. }
    47. // System.out.println("Response Body: " + response.toString());
    48. }
    49. }
    50. }

    但是我们经过测试发现

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

    只会记录一次阅读量

    这说明

    CSDN自带有反爬的程序

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

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

    然后延迟启动

    利用的是多线程的知识

    创建线程池

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

    我们遍历数组

    主方法代码

    1. import java.io.IOException;
    2. import java.util.concurrent.Executors;
    3. import java.util.concurrent.ScheduledExecutorService;
    4. import java.util.concurrent.TimeUnit;
    5. public class Main {
    6. public static void main(String[] args) throws Exception {
    7. String[] urls = {
    8. "https://blog.csdn.net/qq_30500575/article/details/139987333?spm=1001.2014.3001.5501",
    9. "https://blog.csdn.net/qq_30500575/article/details/139962431?spm=1001.2014.3001.5501",
    10. "https://blog.csdn.net/qq_30500575/article/details/139962247?spm=1001.2014.3001.5501",
    11. "https://blog.csdn.net/qq_30500575/article/details/139926411?spm=1001.2014.3001.5501",
    12. "https://blog.csdn.net/qq_30500575/article/details/139920678?spm=1001.2014.3001.5501",
    13. "https://blog.csdn.net/qq_30500575/article/details/139920678?spm=1001.2014.3001.5501",
    14. "https://blog.csdn.net/qq_30500575/article/details/139904327?spm=1001.2014.3001.5501",
    15. "https://blog.csdn.net/qq_30500575/article/details/139904250?spm=1001.2014.3001.5501",
    16. "https://blog.csdn.net/qq_30500575/article/details/139841808?spm=1001.2014.3001.5501",
    17. "https://blog.csdn.net/qq_30500575/article/details/139841808?spm=1001.2014.3001.5501",
    18. "https://blog.csdn.net/qq_30500575/article/details/139842155?spm=1001.2014.3001.5501",
    19. "https://blog.csdn.net/qq_30500575/article/details/139857617?spm=1001.2014.3001.5501",
    20. "https://blog.csdn.net/qq_30500575/article/details/139857996?spm=1001.2014.3001.5501",
    21. "https://blog.csdn.net/qq_30500575/article/details/139858097?spm=1001.2014.3001.5501"
    22. // Add more URLs as needed
    23. };
    24. // 创建定时执行的线程池
    25. ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    26. // 循环访问多个网址,并每隔20秒执行一次
    27. for (String url : urls) {
    28. Runnable task = () -> {
    29. try {
    30. PostRequestSender sender = new PostRequestSender(url);
    31. sender.sendPostRequest();
    32. } catch (IOException e) {
    33. e.printStackTrace();
    34. }
    35. };
    36. // 初始延迟10秒,每隔50秒执行一次任务
    37. executor.scheduleAtFixedRate(task, 10, 50, TimeUnit.SECONDS);
    38. }
    39. // 等待所有任务完成后关闭线程池
    40. executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    41. executor.shutdown();
    42. }
    43. }

    启动 查看控制台信息

    注意联网哦

    依次爬取打印

    博客的阅览量也在增长

    同时还会打印状态码和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

  • 相关阅读:
    高级性能测试系列《36.压力测试场景:1.普通线程组、2.阶梯线程组,阶梯线程组可以看聚合报告吗?不看。》...
    OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
    Centos7 安装 Nginx及启动命令
    C++ day7
    rk3568 RT-LINUX 测试
    Java ByteArrayOutputStream.toString()方法具有什么功能呢?
    Python的PyQt框架的使用-构建环境篇
    通用的改进遗传算法求解带约束的优化问题(MATLAB代码)
    javac 和 java 命令
    关于numpy库的一些函数使用的记录
  • 原文地址:https://blog.csdn.net/qq_30500575/article/details/139993658
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号