【入狱级】简简单单的一个爬虫程序

385次阅读
没有评论

共计 4681 个字符,预计需要花费 12 分钟才能阅读完成。

内容目录

入狱级的爬虫程序

 前几天我在某Java技术群里发现一群大佬在讨论如何获取黄色网站。其中有人谈到通过对域名进行暴力枚举,然后通过访问域名获取网站源码,最后再对网站源码进行分析,看看存不存在相关的关键词,如果存在,则将该网址保存到文件里。

 受此启发,我通过ChatGPT写了一个简简单单的爬虫程序,该爬虫程序能爬取互联网中任何你想要的资源。在介绍之前,我需要强调:计算机是工具,用得好,可以大大提高学习和工作效率;用得不好,下辈子就得在监狱中过日子了

原理分析

 原理在上文中已经提到了,我这里将整个流程列出:

  • 1.暴力枚举出一些域名
  • 2.访问域名获取该域名的首页源码
  • 3.检查源码中是否包含有关键字
  • 4.如果有关键字则保存到文件中

实现

 这里我用Java实现。同时爬取的资源是一些黄色网站。黄色网站对于绝大多数有需求的人来时是难以获取的,并且黄色网站在互联网中一直处于阴暗的一角。但这些对于计算机boy们来说,是形同虚设。

王小波曾说:“在性面前不需要装神弄鬼坦荡荡接受”。

整体代码

public class StudyResource {
    // 关键词列表,也就是你的爬虫需求
    private final static String[] keyWords = {"国产", "成人", "日韩", "无码", "高清视频", "制服", "诱惑"};// 关键词自己扩充。。。不然显得我很变态

    public static void main(String[] args) {

    }

    // 暴力枚举域名,并返回域名列表
    public static List<String> generateUrl(){

    }
    // 将域名追加至文件中
    public static void saveToFile(String url,String fileName){

    }
    // 访问域名进行相关操作
    public static void visitWeb(String visitUrl){

    }
    // 检查文本中是否包含关键字
    public static boolean check(String line){

    }

}

check方法

 遍历关键字列表,每个关键字作为子串,因此这个方法的实现就变成了判断子串是否存在问题了。

public static boolean check(String line){
      for (String e :
              keyWords) {
          if(line.contains(e)){
              return true;
          }
      }

      return false;
}

saveToFile方法

 简单的文件IO流操作,该方法的功能是将url字符串存入到文件中,注意要以追加的形式写入。

    public static void saveToFile(String url,String fileName){
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName + ".txt",true))) {
            writer.write(url + "\n");
            System.out.println("数据已成功写入文件");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

visitWeb方法

 简单的网络IO流处理操作,不会的可以问ChatGPT。该方法的功能是:从传入的url地址中获取url的网站源码,然后检查源码中是否包含关键字,如果包含,则保存到文件中。

    public static void visitWeb(String visitUrl){
        try {
            URL url = new URL(visitUrl);
            URLConnection urlConnection = url.openConnection();
            urlConnection.setConnectTimeout(5000);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null){
                if(check(line)){
                    System.out.println("网址:" + visitUrl + " 发现一个结果!");
                    saveToFile(visitUrl,"学习资料");
                    break;
                }
            }
        } catch (MalformedURLException e) {
            System.out.println("URL格式不正确:" + visitUrl);
        } catch (IOException e) {
            System.out.println("网络连接异常:" + visitUrl);
        }
    }

main方法

 为了提高爬取效率,我们需要创建线程池进行多线程的爬取。

    public static void main(String[] args) {
        List<String> urls = generateUrl();
        // 线程数量 视计算机性能设定
        int threadCount = 150;
        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
        for (String url :
                urls) {
            executor.execute(() -> {
                visitWeb(url);
            });
        }
        executor.shutdown();
    }

完整代码

import java.awt.image.VolatileImage;
import java.io.*;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class StudyResource {
    private final static String[] keyWords = { "成人", "日韩", "无码", "高清视频", "制服", "诱惑", "人妻"};

    public static void main(String[] args) {
        List<String> urls = generateUrl();
        int threadCount = 200;
        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
        for (String url :
                urls) {
            executor.execute(() -> {
                visitWeb(url);
            });
        }
        executor.shutdown();
    }

    public static List<String> generateUrl(){
        List<String> urls = new ArrayList<>();
        List<String> baseChar = new ArrayList<>();
        String urlHead = "https://";
        String urlEnd = ".com";
        // 加入数字
        for(int i=0;i<=9;i++){
            baseChar.add("" + i);
        }
        // 加入大小写字符
        for(char ch = 'a';ch <= 'z';ch++){
            baseChar.add("" + ch);
        }
        // 生成四位长度的域名
        for (int i = 0; i < baseChar.size(); i++) {
            for (int j = 0; j < baseChar.size(); j++) {
                for (int k = 0; k < baseChar.size(); k++) {
                    for (int l = 0; l < baseChar.size(); l++) {
                        //urls.add(urlHead + baseChar.get(i) + baseChar.get(j) + baseChar.get(k) + baseChar.get(l) + urlEnd);
                        String url = urlHead + baseChar.get(i) + baseChar.get(j) + baseChar.get(k) + baseChar.get(l) + urlEnd;
                        urls.add(url);
                    }
                }
            }
        }
        return urls;
    }

    public static void saveToFile(String url,String fileName){
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName + ".txt",true))) {
            writer.write(url + "\n");
            System.out.println("数据已成功写入文件");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void visitWeb(String visitUrl){
        try {
            URL url = new URL(visitUrl);
            URLConnection urlConnection = url.openConnection();
            urlConnection.setConnectTimeout(5000);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null){
                if(check(line)){
                    System.out.println("网址:" + visitUrl + " 发现一个结果!");
                    saveToFile(visitUrl,"学习资料");
                    break;
                }
            }
        } catch (MalformedURLException e) {
            System.out.println("URL格式不正确:" + visitUrl);
        } catch (IOException e) {
            System.out.println("网络连接异常:" + visitUrl);
        }
    }
    public static boolean check(String line){
        for (String e :
                keyWords) {
            if(line.contains(e)){
                return true;
            }
        }

        return false;
    }
}

运行结果

 由于暴力枚举出的url非常之多,再加上每次网络访问都需要一定的响应时间,因此完整枚举下来是需要很长时间,请耐心等待。

【入狱级】简简单单的一个爬虫程序

 不过因为实现的方式是发现一个写入一个,因此你在爬取的过程中就能访问txt里的内容了。

【入狱级】简简单单的一个爬虫程序

优化策略

 如果想要实现精确搜索或提高爬取效率,可以从以下方面入手:

  • 提高线程数量
  • 使用异步的网络请求框架
  • 加入xyz、top、cn等后缀
  • 加入更多的关键词
  • 当源码包含一定数量的关键词时才保存url(提高关键词的纯度)
  • ...

使用声明

 不得通过本程序搜索任何非法网站,不得传播任何非法网站,凡是通过使用本程序造成的任何法律纠纷的,博主本人均不负责!

其它

 跑了1个多小时的结果:点击获取学习资料

 多撸伤身,少撸也伤身。大多数黄色网站都涉及诈骗,浏览时请警惕电信诈骗,请勿相信任何内容。

正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2023-11-02发表,共计4681字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
Rust中所有权与借用规则概述

Rust中所有权与借用规则概述

在GC与手动管理内存之间,Rust选择了第三种:所有权机制...