共计 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个多小时的结果:点击获取学习资料
多撸伤身,少撸也伤身。大多数黄色网站都涉及诈骗,浏览时请警惕电信诈骗,请勿相信任何内容。