从百度搜索结果跳转到指定链接前,百度会发送一些参数,可以利用referer属性,在本站访问时记录百度跳转来之前的一些参数。

利用百度跳转前参数,进行一些相关的seo优化。

目前所用到的一些参数说明如下:

wd - 最终搜索词
bs - 前一次搜索词
tn - 到达搜索引擎的方式,如:baidu,直接打开,sitehao123,从123网站进入
f - 3:下拉框选择,8:用户自主搜索
oq - 用户输入搜索词(f=3时才会出现)
cl - 搜索类型(3-网页)
pn - 页数(页数*10)

inputT= 从打开百度主页,在对话框输入开始计时,到你点击搜索之间的时间。

filter代码如下:

import java.io.IOException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @author xuejt
* 搜索引擎访问过滤器
*/
public class KeyWordFilter implements Filter {
/**
* 要记录的搜索引擎域名
*/
private static ArrayList<String> DOMAINLIST = null;
/**
* 需要转码的key列表
*/
private static ArrayList<String> DECODEWORDLIST = null;
/**
* 自定义记录cookie名
*/
private static final String SEARCH_COOKIE_KEY = "search_cookie";
/**
* 自定义cookie过期时间
*/
private static final int COOKIE_MAX_AGE= 1440;
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try { HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response; // 获取referer
String referer = req.getHeader("referer"); // 循环过滤域名
for (String domain : DOMAINLIST) { if (null != referer && referer.contains(domain)) { // 如果是从指定域名跳转到本站时,需要记录跳转前参数
System.out.println("************** param **************");
if (referer.contains("?")) {
String[] searchParams = referer.substring(referer.indexOf("?") + 1).split("&");
String[] p = null;
for (String param : searchParams) {
p = param.split("=");
// 判断当前参数是否需要中文转码
if (DECODEWORDLIST.contains(p[0])) {
p[1] = URLDecoder.decode(p[1], "UTF-8");
}
System.out.println(p[0] + " - " + p[1]);
}
} System.out.println("************** param **************");
System.out.println(); // 获取当前访问的cookie列表
Cookie[] cookies = req.getCookies();
if (cookies != null && cookies.length > 0) {
System.out.println("************** cookie **************");
int index = 0;
Cookie tmpCookie = null;
while (tmpCookie == null && index < cookies.length) {
// 判断当前cookie列表中是否有自己设定的cookie
if (cookies[index].getName().equals(SEARCH_COOKIE_KEY)) {
tmpCookie = cookies[index];
System.out.println("已有cookie - " + tmpCookie.getValue());
}
index++;
}
if (tmpCookie == null) {
// 如果没有自己设定的cookie,表示是新用户访问或cookie已过期
tmpCookie = new Cookie(SEARCH_COOKIE_KEY, UUID.randomUUID().toString());
tmpCookie.setMaxAge(COOKIE_MAX_AGE); // 设置cookie过期时间
res.addCookie(tmpCookie);
System.out.println("设置新cookie - " + tmpCookie.getValue());
}
System.out.println("本次访问时间 - " + sdf.format(new Date()));
System.out.println("本次访问的ip - " + req.getLocalAddr()); System.out.println("************** cookie **************");
} }
}
} catch (Exception e) {
e.printStackTrace();
}
chain.doFilter(request, response); } @Override
public void init(FilterConfig arg0) throws ServletException {
/*
* 增加要捕获域名
*/
DOMAINLIST = new ArrayList<String>();
DOMAINLIST.add("www.baidu.com"); /*
* 增加要转码的参数名
*/
DECODEWORDLIST = new ArrayList<String>();
DECODEWORDLIST.add("wd");
DECODEWORDLIST.add("bs");
DECODEWORDLIST.add("oq"); } }

转自:https://www.cnblogs.com/anranwuse/p/3630074.html

利用referer属性,记录百度搜索跳转参数的更多相关文章

  1. 利用python爬取海量疾病名称百度搜索词条目数的爬虫实现

    实验原因: 目前有一个医疗百科检索项目,该项目中对关键词进行检索后,返回的结果很多,可惜结果的排序很不好,影响用户体验.简单来说,搜索出来的所有符合疾病中,有可能是最不常见的疾病是排在第一个的,而最有 ...

  2. 【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...

  3. 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...

  4. 记录这一刻:百度搜索结果“文件格式:-HTML文本”

    只要百度搜索关键词无论结果是"文件格式:-HTML文本",现在,这个问题已经被修复. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG ...

  5. 利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)

    实现功能描述: 1.实现搜索框的智能提示 2.第二次浏览器缓存结果 3.实现仿百度搜索 <!DOCTYPE html> <html xmlns="http://www.w3 ...

  6. Vue调用百度接口做百度搜索

    这两天由于学习需要,需要用vue来调用api接口,但是以前没怎么接触过用vue来调用接口,不会没关系,发挥我们强大的学习能力,都不是事,学习了半天基本也就可以初级上手了,写篇随笔记录下来,方便以后回顾 ...

  7. 百度搜索 “Java面试题” 前200页(面试必看)

    前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...

  8. JavaScript-dom3 json_str dom元素控制 模拟百度搜索

    访问关系-封装代码 html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  9. Python:输入关键字进行百度搜索并爬取搜索结果

    学习自:手把手教你用Python爬取百度搜索结果并保存 - 云+社区 - 腾讯云 如何利用python模拟百度搜索,Python交流,技术交流区,鱼C论坛 指定关键字,对其进行百度搜索,保存搜索结果, ...

随机推荐

  1. python全栈开发day98-DRF

    1.CBV源码流程 2.restful协议 1 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性 2 面向资源架构(RO ...

  2. Bootstrap 框架、插件

    Bootstrap,前端工程师比较常用的框架.插件,根据它的定义,我们不妨这样理解,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自 ...

  3. 启动 ServiceFabric Windows服务报1053

    Remote Procedure Call (RPC) Locator和 Windows Firewall是否启动. 以管理员身份运行PowerShell,输入Unregister-Scheduled ...

  4. day 51 js-2 函数,对象,正则 (定时器示例)

    本文转载自cnblogs.liwenzhou-----哪吒博客 先来一个定时器让我们看看函数的效果: <script src="/js/jquery-3.2.1.min.js" ...

  5. POJ 1195 Mobile phones【二维树状数组】

    <题目链接> 题目大意: 一个由数字构成的大矩阵,开始是全0,能进行两种操作1) 对矩阵里的某个数加上一个整数(可正可负)2) 查询某个子矩阵里所有数字的和要求对每次查询,输出结果 解题分 ...

  6. PostgreSQL 调用存储过程返回结果集

    创建返回结果集类型的存储过程: CREATE OR REPLACE FUNCTION public.f_get_member_info( id integer, productname charact ...

  7. js异步梳理:1.从浏览器的多进程到JS的单线程,理解JS运行机制

    大家很早就知道JS是一门单线程的语言.但是也时不时的会看到进程这个词.首先简单区分下线程和进程的概念 1. 简单理解进程 - 进程是一个工厂,工厂有它的独立资源 - 工厂之间相互独立 - 线程是工厂中 ...

  8. Linux学习笔记10

    创建文件 touch touch filenames 创建文件夹 mkdir mkdir dir3 dir4 dir5 建立多个文件夹 mkdir ~/games  在登录用户的本目录之下建立game ...

  9. 橡皮筋进度条ElasticProgressBar

    橡皮筋进度条ElasticProgressBar 橡皮筋进度条是一个极具动画效果的进度条.该进度条不仅具有皮筋效果,还带有进度数据显示,让用户可以很清晰的看到当前的进度,可用于下载.加载进度等场景.E ...

  10. Java中的位运算符

    Java提供的位运算符有:左移( << ).右移( >> ) .无符号右移( >>> ) .位与( & ) .位或( | ).位非( ~ ).位异或( ...