http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 65015|回复: 49
打印 上一主题 下一主题

[接口] 抓取百度关键字智能提示,抓取百度关键字提示实现(附源代码)

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-14 10:46:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
大家如有兴趣的话可以下载这个例子看看。下载地址:
baiduList.zip (142.14 KB, 下载次数: 2223)
大家都见过这种效果吧


怎么样把他引入到自己的网站里面呢?下面咱们一起来分析一下吧
使用Ie9的”开发工具“可可以轻松获取到,在你输入一个关键字时百度是怎么获取智能提示,就是相关的关键字的。
一起来看一下吧

大家可以清楚的看到在我们每次修改查询框时,百度就是发一个Ajax请求去调相应的数据
地址就是:http://suggestion.baidu.com/su?wd=博客&p=3&cb=window.bdsug.sug&t=1324271669786
大家不难看出来吧,wd=博客 这个博客 就是我输入的关键字,如果你想使用其它的关键字的话,只需要动太的修改wd的值就行了。
这时大家一定会这样想,我们是不是只要发一个Get请求,只要每次在我们自己的网站上查询时动态的发一个Ajax请求去访问这个地址就行了呢?是的,
但大家一个不要傻着去使用Http请求,因为这样的请求是从你的服务器发起的,当然百度肯定是会封你的。
我们需要怎么做才能避免这个问题呢?
那就只有一个方法了,使用Js,在客户端执行请求。因为Js是在客户端发起的,就算是百度封的话,那它封的是所有过量使用你网站的用户,相信百度不会傻到这点上吧。因为这样他们失去很多用户
所以这个方法应该 是成立的
但是大家都知道Js是不能跨越访问的,而百度又不可能给你跨越的接口,或者是权限,我们应该怎么办呢?
简单,我们上面也看到了,Baidu给我们的是一个Jsonp的数据格式,那么我们就可以直接使用Jsonp的方法去发起Ajax请求了,因为返回Jsop格式数据的JS是可以跨越访问的
大家一起来看下我的代码吧。
[HTML] 纯文本查看 复制代码
function FillUrls() {
    var strdomin = $.trim($("#Text1").val());
    var qsData = { 'wd': strdomin, 'p': '3', 'cb': 'ShowDiv', 't': '1324113456725' };
    $.ajax({
        async: false,
        url: "http://suggestion.baidu.com/su",
        type: "GET",
        dataType: 'jsonp',
        jsonp: 'jsoncallback',
        data: qsData,
        timeout: 5000,
        success: function (json) {
        },
        error: function (xhr) {
            alert(xhr);
        }
    });
}

代码很简单大家一看应该就明白了,我只解释一下这句吧
var qsData = { 'wd': strdomin, 'p': '3', 'cb': 'ShowDiv', 't': '1324113456725' };
wd是我们要输入的关键字。
p  和就不用管了
cb是什么呢?是Ajax返回是直接调用的方法,个是百度返回的数据里面会执行方法进行调用,我们不用做任何的处理
只需要写一个方法接受数据就行了
[HTML] 纯文本查看 复制代码
function ShowDiv(strurls) {
    var urls = strurls["s"];
   }

urls 这个就是我们需要的数据,我们一起来看看调用后返回的数据是什么样式的吧
ShowDiv({q:"博客",p:false,s:["博客中国","博客园","博客大巴","博客网","博客登陆","博客注册","博客搜索","博客群发","博客 新浪","博客群发大师"]});
这就是百度返回的数据,我们只需要s后面的数据就行了,现在应该明白我写var urls = strurls["s"]; 这句的意思了吧。
在个时候大家可以自己试试了。
因为百度只返回的数据,所以我们还要做一个智能提供的框,当然也就可以自己定义样子了。先来看看这个框吧
[HTML] 纯文本查看 复制代码
<div style="display: none; position: absolute;" id="allSitesBoxHdl" class="classlist"
        onmouseover="this.style.display='block'">
        <ul id="allSitesBoxContent">
        </ul>
    </div>

样式如下
[CSS] 纯文本查看 复制代码
#allSitesBoxHdl.classlist
{
    position: absolute;
    background-color: #F5FBFF;
    width: 256px;
    border: 1px solid #C9E4F4;
    top: 28px;
    left: 0;
    text-align: left;
    font-size: 14px;
    line-height: 30px;
    padding: 1px;
}
#allSitesBoxHdl.classlist li
{
    display: inline;
}
#allSitesBoxHdl.classlist li.lis a
{
    text-decoration: none;
    height: 30px;
    width: 210px;
    float: left;
    padding-left: 8px;
    color: #666;
}
#allSitesBoxHdl.classlist li.lis a:hover
{
    color: #016493;
    background-color: #edf6fb;
}
#allSitesBoxHdl.classlist li.lis a:active
{
    color: #016493;
    background-color: #edf6fb;
}
#allSitesBoxHdl.classlist li.lis input
{
    cursor: pointer;
    color: #FF6600;
    border-right: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
    height: 22px;
    margin: 4px;
    line-height: 22px;
    float: right;
    background: #fff;
}
.wena
{
    color: #666;
    font-size: 12px;
    height: 30px;
    line-height: 30px;
    width: 250px;
    float: left;
}

第一步我们需要一个注册事件来完成控件的一些效果事件的绑定,当我们输入数据时才能的效果
方法如下
[HTML] 纯文本查看 复制代码
//注册对象的事件
function Init() {
    $("#allSitesBoxHdl")[0].style.display = "none";
    $(":text").each(function () {
        if ($(this)[0].getAttribute('url') == 'true') {//给所有的text加属性
            $(this).bind("keyup", OnKeyup); //按键时
            $(this).bind("mousedown", BoxShowUrls); //鼠标安下时
            $(this).bind("mouseout", BoxHide); //鼠标离开时
            $(this).bind("paste", OnPaste); //处理http;//
            $(this)[0].setAttribute("autocomplete", "off");
        }
    });
}

这个方法这句 if ($(this)[0].getAttribute('url') == 'true') {//给所有的url=true属性的Text加效果
的意思是,我们所有引用这个网页的Text框中,只要有一个属性是url='true'的都会实现这个效果,也就是说我们只要把样式和Js文件引入一下,然后想让那具控件显示就直接添加一个属性
url='true'就行了,别的什么也不需要做了。是不是很方便啊。
一起来看看绑定方法的实现吧
下面是整个Js文件(这里还包括一个同时输入多个文本框的效果)
[] 纯文本查看 复制代码
[HTML] 纯文本查看 复制代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="Scripts/StyleSheet.css" rel="stylesheet" type="text/css" />
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script src="Scripts/JScript2.js" type="text/javascript"></script>
</head>
<body>
    <form style="text-align: center" id="form1" runat="server">
    <br />  <br />  <br />  <br />  <br />  <br />  <br />
    <input style="width:500px;"  url="true" id="Text1" type="text" /><br/>
       <input style="width:500px;" id="Text2" type="text" />
    <div style="display: none; position: absolute;" id="allSitesBoxHdl" class="classlist"
        onmouseover="this.style.display='block'">
        <ul id="allSitesBoxContent">
        </ul>
    </div>
    <script type="text/javascript">        Init();</script>
    </form>
</body>
</html>

好了我们一起浏览一下效果吧

是不是很拉风啊。
说到这里不仅仅是百度这样,像Soso,Sogou等都可以使用同样的方法来实现。
如果感觉不错的话就给小弟推荐一下吧。

本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
沙发
发表于 2012-9-15 14:30:26 | 只看该作者
谢谢楼主分享
板凳
发表于 2012-9-21 10:57:50 | 只看该作者

谢谢楼主分享
地板
发表于 2012-10-25 10:58:22 | 只看该作者


谢谢楼主分享
5
发表于 2012-11-21 13:43:34 | 只看该作者
谢谢楼主分享
6
发表于 2012-11-21 22:17:10 | 只看该作者
为了下载不得不顶
7
发表于 2012-11-22 02:53:53 | 只看该作者
等了一分钟了 呵呵
8
发表于 2012-11-22 03:26:20 | 只看该作者
怎么下载不了
9
 楼主| 发表于 2012-11-22 10:12:22 | 只看该作者
qq296905447 发表于 2012-11-22 03:26
怎么下载不了

下载成功了吗?
10
发表于 2012-11-30 08:56:46 | 只看该作者
不错哦,楼主。。。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-8 05:31

© 2014-2021

快速回复 返回顶部 返回列表