18年开始带爬虫团队,爬虫采取别人网站的数据,然后脱敏还能再次使用,当时是为企业信息,你看企查查、天眼查、慢慢买这类网站干的就是之类的事情,但是当你自己做网站的时候,你的烦恼也来了,因为开发网站的人并不懂爬虫,自己辛辛苦苦攒的数据,别人轻易的采集走了,估计你也心不甘。
再说现在AI比较火,AI的算法模型都有泛化能,从0到80%的准确率很容易,但更进一步则需要大量的数据,而数据从哪里来呢?很大一部分是通过爬虫来获取的。
反爬设计并不能阻止别人采集自己网站的数据,如果误伤了合法用户再好的反爬策略也没有用,这里需要权衡,关键在于减少对方批量获取数据,有些上市公司的产品也是能轻易能让对手拿到数据,也真是不知所谓,爬虫就让哪些专业的人去做,给他们一些活路,现在谁可以采集,成本太低。
1 验证码
早起极验验证码,后来github中有很多都能攻破,导致国家企业公示系统的数据被掳走。中国裁判文书网之前的数据好爬,后来升级了
tanjunchen/SpiderProject,只要有心还是有很多可以攻克的,只要是你前端js代码有东西,还是可以通过js2py进行执行
2 页面字体反爬
接口返回的数据是做过处理的,前端显示的时候再调整过来
@Data
@Slf4j
public class PatternWrapper {
private Pattern pattern;
private Map<String,String> replaceMap;
private Pattern patternOnlyWord;
private Map<String,String> replaceMapOnlyWord;
public PatternWrapper() {
}
public PatternWrapper(Pattern pattern, Map<String, String> replaceMap, Pattern patternOnlyWord, Map<String, String> replaceMapOnlyWord) {
this.pattern = pattern;
this.replaceMap = replaceMap;
this.patternOnlyWord = patternOnlyWord;
this.replaceMapOnlyWord = replaceMapOnlyWord;
}
public String replaceAll(String wordTemplate){
return replaceAllOnlyWord(wordTemplate,false);
}
public String replaceAllOnlyWord(String wordTemplate,boolean only){
if(StringUtils.isEmpty(wordTemplate)){
return null;
}
Map<String,String> m ;
Pattern p;
if(only){
m = replaceMapOnlyWord;
p = patternOnlyWord;
}else {
m = replaceMap;
p = pattern;
}
Matcher matcher = p.matcher(wordTemplate);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
matcher.appendReplacement(sb, m.get(matcher.group(1)));
}
matcher.appendTail(sb);
return sb.toString();
}
public <T> List<T> replaceList(List<T> list,String... updateField) throws DzmException{
return replaceListOnlyWord(list,false,updateField);
}
public <T> List<T> replaceListOnlyWord(List<T> list,boolean only,String... updateField) throws DzmException{
List<String> fields = Arrays.asList(updateField);
try {
for (T t:list) {
Class<? extends Object> clazz =t.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f:declaredFields) {
if(fields.contains(f.getName())){
Method set = clazz.getMethod("set"+upperCase(f.getName()),f.getType());
Method get = clazz.getMethod("get"+upperCase(f.getName()),null);
set.invoke(t,replaceAllOnlyWord((String)get.invoke(t),only));
}
}
}
}catch (NoSuchMethodException e){
log.error(e.getMessage(),e);
throw new DzmException("没有get或set方法");
}catch (Exception e){
log.error(e.getMessage(),e);
throw new DzmException(e);
}
return list;
}
//首字母转大写,转小写就加32
private