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