总想关注搜索引擎什么时候爬过网站,有点啥事情不知道总感觉心痒痒的,今天闲了下来,就做开发一个这样的功能吧。

之前写了一个urlPatterns为/*的Filter,可以在这里做动手。

我们要知道的是,需要获得什么参数,才能知道是搜索引擎的请求。想了一下,搜索引擎都会附带上自己的user-agent。

搜寻一番,找了了常用的搜索引擎的user-agent列表

大概如下:

public HashMap list() {
    HashMap list = new HashMap<>();
    list.put("msnbot-media","search.msn");
    list.put("bingbot","必应");
    list.put("Sosospider","腾讯搜搜");
    list.put("Sosoimagespider","搜索图片");
    list.put("Yahoo","雅虎");
    list.put("Sogou","搜狗");
    list.put("Googlebot","谷歌");
    list.put("Mediapartners","谷歌");
    list.put("FeedBurner","谷歌");
    list.put("AdsBot","Adwords");
    list.put("Baiduspider-image","百度图片");
    list.put("Baiduspider","百度");
    list.put("360Spider","360");
    list.put("YoudaoBot","网易有道");
    list.put("Speedy","entireweb");
    return list;
}

封装一个类,方法有两个,判断和提取中文名。

list是一个map,暂时想不到什么方法可以将爬虫的ua和中文名存在一起,所以判断的时候应该给个循环,一个个key去进行判断,所以判断的方法应该这样写:

public boolean judge() {
    if (userAgent == null) {
        return false;
    }
    for (Iterator iterator = this.list().entrySet().iterator(); iterator.hasNext(); ) {
        Object o = iterator.next();
        Map.Entry entry = (Map.Entry) o;
        String key = String.valueOf(entry.getKey());
        if (userAgent.contains(key)) {
            this.explain = String.valueOf(entry.getValue());
            return true;
        }
    }
    return false;
}

这时候就可以测试一下,调用返回true,成功啦。

类写完了,回到刚刚的CrossFilter,可以直接调刚刚的类来处理。

CrossFilter的代码修改后则为:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    HttpServletResponse response = (HttpServletResponse) resp;
    HttpServletRequest request = (HttpServletRequest) req;
    response.setHeader("author", "ZiXuLiao");
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("TimeStamp", String.valueOf(CommonUtils.getCurrentTimestampMs()));
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    req.setCharacterEncoding("UTF-8");
    WebSpiderUtils webSpiderUtils = new WebSpiderUtils();
    webSpiderUtils.setUserAgent(request.getHeader("User-Agent"));
    if(webSpiderUtils.judge()){
        //是蜘蛛爬虫,写入数据库逻辑
    }
    chain.doFilter(req, resp);
}

将写入数据库逻辑处理好,就完工了。