网页抓取 加密html(Java的骚操作:方法调用完成小记录+11)
优采云 发布时间: 2021-09-12 07:10网页抓取 加密html(Java的骚操作:方法调用完成小记录+11)
当我们在页面上看到的是数据,而在 HTML 中,我们看到它是用字符加密的。当我们抓取整个 HTML 时,我们将抓取加密的内容。
示例:
其实在前端字符串加密中,可以根据请求查看使用的加密。
其实看到这个我就知道怎么解密了。我在互联网上搜索了很多。大部分都是用Python写的,但是我用的是Java,好无奈!
在这个请求的URL中,可以看到使用的加密是base64,后面是需要的key。但是每个页面的key都会变,所以只能查每个页面有没有这个东西;
纯属巧合。哈哈哈哈。 . . .
下面我们来看看Java的骚操作:
package com.cmcc.crawler.common;
import org.apache.commons.lang3.StringUtils;
import sun.font.Font2D;
import sun.font.Font2DHandle;
import sun.font.TrueTypeFont;
import sun.font.TrueTypeGlyphMapper;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Base64;
/**
* @NAME: zhaoxj
* @DESC: ..
* @DATE: 2021/3/12
* @TIME: 11:01
* @YEAR: 2021
* @MONTH: 03
**/
public class Base64Util {
//安居客字符解码
public static String decodeString(String key, String encodeString) {
try {
//base64解码,初始化字体
byte[] ss = Base64.getDecoder().decode(key);
InputStream inputStream = new ByteArrayInputStream(ss);
Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);
FontRenderContext fontRenderContext = new FontRenderContext(new AffineTransform(), false, false);
GlyphVector glyphVector = dynamicFont.createGlyphVector(fontRenderContext, "");
//获取font中字形的映射关系,字段为private,使用反射
Class clazz = Font.class;
Field[] fs = clazz.getDeclaredFields();
Font2DHandle font2DHandle = null;
for (int i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);// 将目标属性设置为可以访问
if (fs[i].getName().equals("font2DHandle")) {
font2DHandle = (Font2DHandle) fs[i].get(dynamicFont);
}
}
//得到映射关系
Font2D font2D = font2DHandle.font2D;
TrueTypeFont trueTypeFont = (TrueTypeFont) font2D;
TrueTypeGlyphMapper charToGlyphMapper = (TrueTypeGlyphMapper) trueTypeFont.getMapper();
//开始解密,encodeString为加密后的字符串
StringBuffer buffer = new StringBuffer();
char[] chars = encodeString.toCharArray();
for (int i = 0; i < chars.length; i++) {
buffer.append(charToGlyphMapper.charToGlyph(chars[i]) - 1);
}
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
方法调用
完整的小记录+1