1 界面搭建

界面元素包括logo图片、搜索框和搜索按钮。通过css和HTML创建:

代码如下:

<style>*{margin:0;padding:0;}body{background:#99eab9}img,input,button{display:block;margin:auto}ul{list-style:none;}a{text-decoration:none;}#logo{width:270px;height:129px;margin-top:50px;display:block;}#searchDiv{       width: 641px;height: 34px;margin:  auto;margin-top:15px;}#searchText{width:537px;height:30px;float:left}#button{width:100px;height:34px;text-align:center;font-size:16px;cursor:pointer;}#keyContainer{width: 641px;margin:auto;}#keyWords{width:539px;border:1px solid #575757;line-height:30px;display:none;}#keyWords ul li{cursor:pointer;}#keyWords ul li:hover{background:#cacaca;}
</style></head><body>
<img id="logo" src="./images/baidu.png" />
<div id = "searchDiv"><span><input type="text" id="searchText"/><button id="button">百度一下</button></span>
</div>
<div id="keyContainer"><div id="keyWords"><ul id="key"></ul></div>
</div>
</body>

2 搜索服务

每次输入关键词进行搜索百度都会给出一些关键词联想,例如我们搜索JavaScript,则会出现下面的页面形式:

我们通过在Chrome中抓包发现,当输入关键词时会产生一次请求,请求链接如下:

https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=JavaScript&json=1&p=3&sid=1423_21110_26923_20928&req=2&bs=111&pbs=111&csor=10&pwd=jav&cb=jQuery110204138693140994414_1534129815131&_=1534129815189

该请求的响应为:

jQuery110204138693140994414_1534129815131({"q":"javascript","p":false,"bs":"111","csor":"10","status":0,"g":[ { "q": "javascript学习指南", "t": "n", "st": { "q": "javascript学习指南", "new": 0 } }, { "q": "href=jacascript::void(0)", "t": "n", "st": { "q": "href=jacascript::void(0)", "new": 0 } }, { "q": "js高级程序设计第三版 pdf", "t": "n", "st": { "q": "js高级程序设计第三版 pdf", "new": 0 } } ],"s":["javascript学习指南","href=jacascript::void(0)","js高级程序设计第三版 pdf"]});

可以看到返回的对象s属性里的内容正是联想到的关键词!而该部分的头部正好对应于请求链接的cb参数,且当我们修改了可以发现cb参数对应的值时,响应对象的头部也会对应发生变化。请求查询的参数中只有wdcb两个参数是真正有用的。wd参数对应于用户输入的关键词,cb参数则是一个回调函数,该函数包含一个参数,是一个对象,联想关键词信息就保存在该对象的s属性里。
因此,我们只要修改请求链接的wdcb参数并在浏览器中输入该链接即可得到相应的百度搜索的联想关键词。例如设置wd参数值为vue,得到的联想关键词与在百度搜索中得到的结果是一样的:


那么,我们只要在搜索框输入内容时,将输入内容赋给wd参数,然后调用一次该链接就可以了。
但是,浏览器一般是不允许跨域访问的,我们怎么能在自己建立的搜索页面中去跨域访问百度搜索呢?
其实,虽然不能跨域访问,但是可以引入外部脚本,即通过<script>标签引入外部js文件。我们也可以通过这种方式来实现。

<script src= "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=vue&cb=myQueryFuction"></script>

同时我们还需要定义一个与cb参数对应的回调函数,并在函数中执行一系列操作:获取到联想关键词,并将内容挂到页面上展示,并实现点击获取该词条的搜索结果页面。请求响应结果为该函数的实参,因此定义参数的时候要有相对应的形参。

<script>var oText = document.getElementById("searchText");oText.onkeyup = function(){var value = this.value;//console.log(value);var oScript = document.createElement("script");oScript.src= "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+value+"&cb=myQueryFuction";document.body.appendChild(oScript);}var oButton = document.getElementById("button");oButton.onclick = function(){var val = oText.value;console.log(val);window.location.assign("https://www.baidu.com/s?wd="+val);}var keyNode = document.getElementById("keyWords"),oUl =  document.getElementById("key");function myQueryFuction(data){   //data为对应的形参//清除上一次的关键词联想oUl.innerHTML = "";//console.log(data.s);var keywordsArr = data.s;//排异处理,使用if判断,当关键词数组长度为0时,关键字联想div隐藏if(!keywordsArr.length){return keyNode.style.display="none";}keyNode.style.display="block";keywordsArr.forEach(function(val,index){var oLi = document.createElement("li");oLi.innerText = val;oLi.onclick = function(){window.location.href = "https://www.baidu.com/s?wd="+val;}oUl.appendChild(oLi);});};</script>

最终,我们搜索vue可以得到以下页面:

3 总结

其实这里我们利用的就是JSONP技术。Jsonp(JSON with Padding) 是 json 的一种”使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域读取数据。由于同源策略,一般来说位于 server1.example.com的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script>元素是一个例外。利用 <script>元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

JSONP的工作原理是将一个<script>元素动态插入到页面上,并将其源设置为我们要查询的跨域URL。通过在URL的查询字符串上传递相关参数,它可以以表示我们请求的数据的JavaScript格式返回动态响应。

3.1 服务端JSONP格式数据

如客户想访问 : http://www.runoob.com/try/ajax/jsonp.php?jsonp=callbackFunction。
假设客户期望返回JSON数据:[“customername1”,”customername2”]。
真正返回到客户端的数据显示为: callbackFunction([“customername1”,”customername2”])。
服务端文件jsonp.php代码为:

<?php
header('Content-type: application/json');
//获取回调函数名
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);
//json数据
$json_data = '["customername1","customername2"]';
//输出jsonp格式的数据
echo $jsoncallback . "(" . $json_data . ")";
?>

3.2 客户端实现 callbackFunction 函数

<script type="text/javascript">
function callbackFunction(result, methodName)
{var html = '<ul>';for(var i = 0; i < result.length; i++){html += '<li>' + result[i] + '</li>';}html += '</ul>';document.getElementById('divCustomers').innerHTML = html;
}
</script>

页面展示

<div id="divCustomers"></div>

移花接木之真假baidu相关推荐

  1. 日志分析之识别真假蜘蛛与处理办法

    导读(日志分析是站长必须要做的事情,如果一个网站主或者seoer不对日志进行分析,那么他绝对不是一个合格的站长.日志分析相关知识很多,我相信大部分站长对基础分析都会掌握,但是一些深入的日志分析问题可能 ...

  2. 什么才是真正的云主机?辨别真假云主机

    山寨云主机充斥市场 教您辨别真假云主机 用"云里雾里"形容中小企业用户对云计算的理解与认知并不为过,毕竟云计算这一概念并没有统一标准,而云主机作为云计算构建的基石和最早落地的先遣产 ...

  3. python爬虫进阶-每日一学(字体反爬-移花接木)

    目的 分析与学习更多的字体反爬套路 详细需求 url:http://glidedsky.com/level/web/crawler-font-puzzle-2 思路解析 一.审查 二.分析 impor ...

  4. 【QQ音乐Api】移花接木 打造自己的音乐电台

    为什么80%的码农都做不了架构师?>>>    最近突发奇想想做个在线音乐小网页.需求很简单,如下 搜索歌曲 或 歌手 在线播放音乐 借用qq 或者 百度的 音乐接口 需求明确那就直 ...

  5. 白话REST-识别真假REST

    大家对REST的认识? 谈到REST大家的第一印象就是通过http协议的GET,POST,DELETE,PUT方法实现对url资源的CRUD(创建.读取.更新和删除)操作.比如 http://www. ...

  6. linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置...

    如果ping域名的时候出现ping:unknown host  xxx.xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好, 查看一下配置文件/etc/resolv.conf ...

  7. 在baidu上找到自己

    在baidu上搜了我经常用的用户名,找到了这里,一看都满屋子都是灰尘,我打扫了一下.也清理了自己.发现那时的自己好冲动.好小孩. 其实现在也一样.我不想去否认自己的过去,但也不想公开这段过去.因为它在 ...

  8. 【Ubuntu】ping: unknown host www.baidu.com

    1.问题描述 每次重新设置网络后,ping百度总是报错: $ ping www.baidu.com ping: unknown host www.baidu.com 2.原因分析 原因是:查看/etc ...

  9. 可疑文件_如何识别文件的真假

    每个人都下载文件,大家有没有想过,文件可能是假的,尤其来自网盘或专门的下载站. 本文就来谈谈如何识别文件的真假. 一.XcodeGhost 事件 我们从一件真实的事件说起. 2015 年 9 月,苹果 ...

最新文章

  1. 印度首席大法官力推 AI 进司法,曾因歧视女性引争议
  2. Ext2.0布局类初探
  3. Spark源码分析之九:内存管理模型
  4. linux关于tcp协议ack的实现--发送端对ack的处理
  5. Riot v4.0.0-alpha.10 发布,JavaScript 的 MVP 框架
  6. SQL慢查询日志与查询分析器explain
  7. 用Matlab处理信号从入门到入土1
  8. 容差分析相关的计算公式
  9. 将博客搬至CSDN_拔剑-浆糊的传说_新浪博客
  10. Mysql中的straight_join
  11. 湖北武汉劳务员证书劳务人员实名制的难点分析建筑七大员培训
  12. uni-app截屏截取页面可视区,以及利用截屏截取完整页面方法
  13. 三井化学将增加TAFMER™高性能弹性体产能
  14. for.in for..of..
  15. HTML 常用转义字符
  16. 江西外语外贸官网 仿写
  17. DW1000 UWB用于pixhawk室内定位
  18. 多语言在线客服系统源码-自动识别中英环境-私有化部署完美支持跨境电商网站...
  19. 2分钟解决 Linux 系统下输入候选框不跟随光标的问题
  20. Interview之DS:人工智能领域求职岗位—数据科学家/数据科学工程师的职位简介、薪资介绍、知识结构之详细攻略

热门文章

  1. 找回在线写博因断网丢失的已编数据
  2. 微信小程序将资源上传阿里云OSS
  3. python反爬虫策略_突破反爬虫策略
  4. 关于python中的open()函数
  5. java基于ssm的宠物用品商城管理系统 springboot vue
  6. layer弹出层传递参数(父传子)
  7. 梅花表309独有的都市女性特别气质
  8. SpringBoot 修改 Multipart 文件大小
  9. 118-idea 激活
  10. PyCharm之open project