网页抓取 加密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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线