当我们在页面看到的是数据,而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