利用JAVA扒某写真网站(附代码和图片)

在敲代码时,弹出广告,广告大概这个样子

咦,小姐姐,cosplay,点进去看看。
好多漂亮的妹子,页面打开很流畅,产品体验极佳。

不过每组图片只能看,如果想打包下载得花rmb。

ctrlC+ctrlV几张后不乐意了,这么保存一来看不到全部图片,二来,麻烦,太麻烦了。
试试吧,看能不能发现点有趣的东东。首先习惯性的看看html源码。

可以看到图片地址几乎都已经出来了,缩略图在前,原图在后,嗯,有点意思,开始扒。

用JAVA写爬虫,配合之前学的ConnectionUtil工具,敲了一晚上,总算把数据爬出来了,

不得不说 ,JAVA的url编码真的恶心,会将整个url链接都进行编码,我也是搞了好大功夫才将中文编码问题解决。

图片还在扒,扒完之后分享。

2018-12-27 更新代码

HomePage类 扒的是图片网址每一个主题图片的网址

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @version 1.0
 * @author 苦逼的年轮
 *
 */
public class HomePage {
	public static void main(String[] args) {
		int Picnum;// 这个是网页的页面数
		for (Picnum = 1; Picnum < 2; Picnum++) {
			String url = "https://amlyu.com/page/" + Picnum;
			String result = ConnectionUtil.Connect(url);
			result = result.replaceAll(" ", "");// 将页面中的空格去除,方便使用正则表达式
			Matcher m = Pattern
					.compile("<atarget=\"_blank\"href=\"https://amlyu.com/[\\s\\S]{1,100}/\">[\\s\\S]{1,70}</a>")
					.matcher(result);// 通过正则表达式匹配图片的网址
			int i = 0;
			while (m.find())
				i++;// 通过i得出有多少个页面 方便设计数组
			String[] stu = new String[i];// 设计图片网址数组
			Matcher m2 = Pattern
					.compile("<atarget=\"_blank\"href=\"https://amlyu.com/[\\s\\S]{1,100}/\">[\\s\\S]{1,70}</a>")
					.matcher(result);// 通过正则表达式匹配图片的网址
			int num = 0;
			while (m2.find()) {
				stu[num++] = m2.group();// 将网址数据存入数组
			}

			for (int j = 0; j < stu.length; j++) {
				int Nbegin = stu[j].indexOf("\">");
				int Nfid = stu[j].indexOf("</a>");
				String name = stu[j].substring(Nbegin + 2, Nfid);// 采集图片网址名称
				System.out.println("资源名:" + name);
				int Xbegin = stu[j].indexOf("https://amlyu.com/");
				int Xfid = stu[j].indexOf("\">");
				String ImgUrl = stu[j].substring(Xbegin, Xfid);// 采集图片网址地址
				System.out.println(("资源地址:" + ImgUrl));
				System.out.println("-----开始采集----");
				// 传入图片网址名称(交给SubPage创建文件夹) 和图片网址(进行下载)
				SubPage.Start(name, ImgUrl);
				System.out.println("-----结束采集----");
				System.out.println();
			}

		}
	}
}

SubPage类 扒当前图片页面所有的图片网址

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @version 1.0
 * @author 苦逼的年轮
 *
 */
public class SubPage {
	public static void Start(String name, String ImgUrl) {
		File file = new File("D:/Pic/");// 创建一个文件夹用于存储文件
		if (!file.exists()) {// 如果文件夹不存在
			file.mkdir();// 再创建文件夹
		}
		file = new File("D:/Pic/" + name + "/");// 通过采集到的网址名称创建图片文件夹
		if (!file.exists()) {// 如果文件夹不存在
			file.mkdir();// 再创建文件夹
		}
		String result = ConnectionUtil.Connect(ImgUrl);
		result = result.replaceAll(" ", "");// 将页面中的空格去除,方便使用正则表达式
		Matcher m = Pattern.compile("src=\\\"https://amlyu.com/[\\s\\S]{1,100}\"alt=\"[\\s\\S]{1,100}\"title")
				.matcher(result);// 采集图片网址
		int i = 0;
		while (m.find()) {
			i++;// 通过i得出有多少张图片 方便设计数组
		}
		String[] stu = new String[i];
		Matcher m2 = Pattern.compile("src=\\\"https://amlyu.com/[\\s\\S]{1,100}\"alt=\"[\\s\\S]{1,100}\"title")
				.matcher(result);
		int ImgNum = 0;
		while (m2.find()) {
			stu[ImgNum++] = m2.group();// 将图片网址录入数组
		}

		for (int ImgDownNum = 0; ImgDownNum < stu.length; ImgDownNum++) {
			int Xbegin = stu[ImgDownNum].indexOf("src=\"");
			int Xfid = stu[ImgDownNum].indexOf("\"alt=");
			String DownUrl = stu[ImgDownNum].substring(Xbegin + 5, Xfid);// 采集图片下载地址
			System.out.println("第" + (ImgDownNum + 1) + "张图片 下载地址:" + DownUrl);
			// 传入图片网址名称(告诉DownImg图片属于哪个目录) 图片下载地址 图片的张数
			DownImg.Img(name, DownUrl, ImgDownNum);
		}
	}
}

DownImg类 将图片分类下载到D盘的Pic文件夹下


import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @version 1.0
 * @author 苦逼的年轮
 *
 */
public class DownImg {
	public static void Img(String name, String DownUrl, int ImgDownNum) {
		try {
			String reg = "[\u4e00-\u9fa5]+";
			Pattern pattern = Pattern.compile(reg);
			Matcher matcher = pattern.matcher(DownUrl);
			while (matcher.find()) {// 重复把汉字进行编码替换
				String han = matcher.group(0);// 正则匹配url中的汉字
				String bmurl = URLEncoder.encode(han, "UTF-8");// 将汉字进行编码
				String start = DownUrl.substring(0, DownUrl.indexOf(han));// 取出出现汉字的前部分
				String len = DownUrl.substring(DownUrl.indexOf(han) + han.length(), DownUrl.length());// 取出出现汉字的后部分
				DownUrl = start + bmurl + len;// 将汉字编码和前后连接形成新的连接
			}
			System.out.println("第" + (ImgDownNum + 1) + "张图片下载成功");
			URL url = new URL(DownUrl);
			// 这里用到 openStream 相比openConnection 后者会得到 modification date 和 http header
			// 等东西,而此刻我们不需要
			DataInputStream dataInputStream = new DataInputStream(url.openStream());// 创建数据输入流
			String imageName = "D:/Pic/" + name + "/" + (ImgDownNum + 1) + ".jpg";// 图片路径
			FileOutputStream fileOutputStream = new FileOutputStream(new File(imageName));// 输出流
			ByteArrayOutputStream output = new ByteArrayOutputStream();// 字符缓冲区
			byte[] buffer = new byte[1024];
			int length;// 读取字符的长度
			while ((length = dataInputStream.read(buffer)) > 0) {
				output.write(buffer, 0, length);
			}
			fileOutputStream.write(output.toByteArray());// 输出图片
			dataInputStream.close();
			fileOutputStream.close();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

将代码进行了美化,现在扒下的结果显示:

期待已久的来了 图片打包下载地址:

链接: https://pan.baidu.com/s/1qJD1Bb__bQl6lP3U3S0T-Q 提取码:4g4n

本文作者:年轮

本文链接:https://bk.google2015.cn/%e5%88%a9%e7%94%a8java%e6%89%92%e6%9f%90%e5%86%99%e7%9c%9f%e7%bd%91%e7%ab%99/

版权声明:请勿用于非法用途
上一篇
下一篇