当前位置: 澳门新濠3559 > 编程 > 正文

前段时间发现了一个网站提供搜索百度网盘资源

时间:2019-11-21 05:33来源:编程
本文主要介绍如何通过Google的API来定义自己的搜索引擎,并将Google搜索框嵌入到自己的web页面。另外,分析了自定义搜索引擎请求数据的url,模拟请求并获取搜索的结果。 因为各种原因

本文主要介绍如何通过Google的API来定义自己的搜索引擎,并将Google搜索框嵌入到自己的web页面。另外,分析了自定义搜索引擎请求数据的url,模拟请求并获取搜索的结果。

因为各种原因,现在做网盘搜索引擎不好做了,一个二个都取消分享功能或者直接关闭网盘功能。360网盘、115网盘等。但是百度网盘依然挺立着,而且用户已经突破4个亿了,而且还会增长。现在很多网友都不知道怎样在百度网盘中搜索自己想要的东东,当然网上有很多网站专门做网盘搜索的,然而我自己也做了一个基于google自定义搜索实现的百站盘,如果是纯搜索东西,那么去这个网站没错。如果想要学习技术,就请看下面的。先来个网站截图

1 写在前面

最近想要在百度网盘里面搜索一些pdf资源,打开以前保存的一个专门搜索百度网盘资源的页面so.baiduyun.me ,页面转了好久,终于出来,但是出现的却是Error 522,链接失效了。最后,在网上找到一个可以用的地址http://pan.java1234.com/,这个地址确实可以搜索百度网盘资源,但是广告超级多,稍有不慎,就进入了一个广告页面,神烦。当时就想能不能寻找到这个网页中资源搜索的地址,然后自己根据这个地址来模拟请求,从而获得查询结果。打开浏览器的调试工具,随意输入一个关键字进行查询,点击查询,然后进行分析。分析发现了一个url请求返回的正是百度网盘搜索结果,数据是json格式。找到了这个获取搜索结果url之后就好办了。我们可以完全自己写一个Winform界面,然后通过这个url去模拟请求,获取结果,这样就没有广告了,想怎么弄就怎么弄,下面介绍一下,如何完成这一系列的过程。

1 写在前面

前段时间发现了一个网站提供搜索百度网盘资源,挺好用的,但是广告很多,于是自己做了一个Winform窗体程序去获取该网站的数据请求,解析并绑定请求的结果。最后,也将实现Winform程序的这一过程分享到了博客园中,也就是我上一篇博文《百度网盘资源搜索器 》。

后面我发现提供网盘资源搜索的网站内部是利用google搜索引擎的api来完成的。在网上搜索了一些资料,捣鼓了google自定义搜索引擎的功能,发现确实挺好玩的。后面又有同仁问能不能介绍一下如何实现使用google搜索的api,那么下面就开始吧。

图片 1

2 分析

2 自定义搜索引擎

1)自定义google的搜索引擎,那首先得有一个google的账号呀,这也是第一步,先注册一个google的账号。

2)注册google的账号之后,进入自定搜索引擎的页面,,页面如下。

图片 2

3)点击右侧的【新增搜索引擎】,填写你搜搜引擎的基本配置。页面如下。

图片 3

我可以看到,只需要配置三项即可完成自定义搜索引擎。

  • 第一个是你需要搜索的网站,也就是说你自定义的这个搜索引擎只会在你填写的单个网页、整个网站或者整个域中去搜索你要想要的信息。在这里我们以百度网盘资源为例,填写www.pan.baidu.com
  • 第二个是语言,这个我们选择所有语言。
  • 最后一个是搜索引擎的名称,我们就填写【百度云盘搜索】

图片 4

4)点击创建,就实现了自己的搜索引擎,点击右侧的【修改搜索引擎】的页面,如下图。

图片 5

在修改搜索引擎的页面中有一个【搜索引擎ID】,这个特别关键,你可以点击它,查看你这个搜索引擎的id编码,还可以公开你这个搜索引擎的网址。还有一个很重要的就是【获取代码】,获取这段代码就能够实现将自定义的搜索引擎框嵌入到你自己定义的web页面中,点击【获取代码】。能够获取到一段html代码,如下:

图片 6

另外,在上面步骤4)的截图1中,可以测试一下,你自定义的搜索引擎。在这里,我们输入【数学】关键字,结果如下。

图片 7

1.jpg

2.1 获取请求头信息

实现这个程序的关键就是如何获取http://pan.java1234.com/百度网盘搜索结果的url,首先我们打开这个页面,启动浏览器调试,然后随意输入一个关键字,点击查询。

图片 8

上图我们可以看到,有一个请求url,返回来的结果就是页面上显示的搜索结果。我们可以看看它的请求地址以及请求头信息。

图片 9

通过查看headers面板可以知道请求信息如下:

  • 请求地址:
  • User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  • Reference:
  • Host:pan1234.com

知道请求地址,user-agent,host,referer请求头信息,我们就可以构造出一个搜索资源的请求,现在我们来分析一下这个请求地址的特点,这个请求地址有一个查询参数q=win7,而我们知道先前在搜索框里面输入的关键字就是win7,由此可以判断,该查询参数代表的搜索关键字。我们可以把这个请求地址在浏览器中打开,然后去去更改这些查询参数,来分析这些查询参数各有什么作用。

经过分析,请求地址中的q参数代表的是搜索关键字;start参数代表的是搜索页面,一共有10页,0代表第一页,10代表第二页,···,90代表第十页,该网页最高显示100条资源结果;而最后的&_=1478436979649可以删掉,在请求中没有实质的作用。

3 如何使用自定义搜索引擎

在第二小节中我们已经创建了属于我们的搜索引擎了,那么下面我们如何使用它。在这里,我采用两种方式,第一种方式直接将第二节中的代码拷贝出来,并嵌入到自己web页面中;第二种方式是分析自定义搜索引擎请求的url结构和请求方式,然后去构造搜索的url,模拟请求获取查询结果。

Google自定义搜索得到搜索引擎 ID

首先需要利用google自定义搜索服务

打开网址:https://cse.google.com/cse/all,点击下图的Add按钮

图片 10

2.jpg

点击后如下图

图片 11

3.jpg

然后填写要搜索的网站,网站规则谷歌已经详细说明了

前段时间发现了一个网站提供搜索百度网盘资源,打开以前保存的一个专门搜索百度网盘资源的页面。您可以添加以下任意内容:

单个网页:www.example.com/page.html
整个网站:www.mysite.com/*
网站的某些部分:www.example.com/docs/* 或 www.example.com/docs/
整个域:*.example.com

因为是对百度网盘搜索,所以现在添加一下两个网站
http://pan.baidu.com/*
http://yun.baidu.com/*

图片 12

4.jpg

继续下方的语言选择-简体中文,搜索引擎的名称自定义,最后点击创建

图片 13

5.jpg

恭喜!

您已成功创建自定义搜索引擎。

如果要测试,也可以点击边上的公开地址;也可以获取代码,添加到网页中,会弹出一个google搜索界面。现在还是点击控制台

图片 14

6.jpg

点击搜索引擎ID,得到ID后备用。

2.2 分析返回的搜索结果格式

经过2.1节分析,我们知道搜索结果的url地址,现在我们随意的构造一个如下。

http://pan1234.com/server3?jsoncallback=jQuery19109864917922941505_1478436979648&q=win7&start=0

在浏览器中显示的效果如下:

图片 15

我们可以知道搜索结果是以json字符串的格式返回的。返回的是一个对象数组,每个资源对象都包含了title,content,unescapedUrl三个属性。

知道了返回的json格式结构,我们就可以在c#中建立相对应的类,然后将这些json数据经过预处理,之后便可以反序列化成为相对应的对象。

3.1 嵌入web页面

首先自定一个html页面,然后把第二节中讲到的代码拷贝到div中,代码如下。

<html>
<body>
<meta charset="utf-8">
    <style type="text/css">
        #main{
            width:750px;
            margin:20px auto;

        }
        #main p{
            text-align:center;
            font-size:25px;
            font-weight:bold;
            margin-button:100px;
        }
    </style>
</body>
<head>
<div id="main">
<p>
百度网盘资源搜索器@Jaume
</p>
<script>
  (function() {
    var cx = '搜索引擎ID';
    var gcse = document.createElement('script');
    gcse.type = 'text/javascript';
    gcse.async = true;
    gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(gcse, s);
  })();
</script>
<gcse:search></gcse:search>
</div>
</head>
</html>

注意:上面的var cx='搜索引擎ID,这个【搜索引擎ID】就是第二节创建自定义搜索引擎时自动生成的,将你创建的搜索引擎ID替换到这里即可。下面是页面效果。
图片 16

这下就实现了将自定义搜索引擎嵌入到自己的web页面。

Google Api

如果要像百站盘那样给程序用,那么就少不了api了。打开Google Api网址https://console.developers.google.com/,然后创建项目

图片 17

7.jpg

创建后再点击左边的

图片 18

8.jpg

然后在右边搜索框中输入Custom Search API

图片 19

9.jpg

点击搜索出来的API

图片 20

10.jpg

点击启用

图片 21

11.jpg

点击创建凭据

图片 22

12.jpg

点击我需要哪些凭据,然后稍等一会就生成了API 密钥,反正就像装软件一样,一路next。

3.程序实现

下面将贴出实现该程序的关键代码,源代码可以到本文章的末尾自行下载。

3.2 模拟请求

通过分析,搜索引擎搜索请求的url为:

https://www.googleapis.com/customsearch/v1element?key=AIzaSyCVAXiUzRYsML1Pv6RwSG1gunmMikTzQqY&rsz=filtered_cse&num=10&hl=zh_CN&prettyPrint=false&source=gcsc&gss=.com&sig=0c3990ce7a056ed50667fe0c3873c9b6&cx=搜索引擎ID&q=数学&sort=&googlehost=www.google.com

url主要参数分析:

  • cx:搜索引擎ID
  • q:搜索关键
  • sort:搜索结果排序方式

构造上面这种模式的url,采用GET的方式去请求,会得到如下返回的json数据,json数据包含了搜索结果以及附带属性(搜索结果总数等)。如下图所示。

图片 23

明白了引擎请求搜索结果的这一流程,那么用c#语言来实现就非常简单了。代码非常简单,就不贴出来。

调用

现在搜索引擎IDAPI 密钥都有了,重点也就来了。就是调用API接口返回json数据。
API测试,这个就是测试地址,里面包含所有的参数,并且也说明每个参数的意思,参数比较多,捡几个重要的说。
q:搜索关键字
num:返回多少个结果
start:从第几个索引开始
cx:搜索引擎ID
key:API 密钥

都填写完成了,点击Execute,google会返回json数据,也会给你一个GET请求地址:https://www.googleapis.com/customsearch/v1?q=unity&cx={搜索引擎ID}&num=10&start=1&key={API 密钥}

对,其中cxkey就是第一步和第二步的产物,然后再用GET请求返回json,然后接收json数据结合在自己的网站里,就成了一个网盘搜索引擎网站。

Google Api免费调用次数为100次,超过就不能调用,但是可以购买次数。

3.1 数据实体类

public class SearchResult
{
    public BDWPResource[] resources { get; set; }
}

public class BDWPResource
{
    public string title { get; set; }
    public string content { get; set; }
    public string unescapedUrl { get; set; }
}

4 总结

使用google的api自定义搜索引擎最最关键的一点就是,你的机器要能够访问google。要是不能访问google,那就只能/(ㄒoㄒ)/~~。本文举的例子是搜索百度网盘资源,当然你也可以搜索博客园的所有资源。

其实,google自定义搜索引擎api还有更加精彩设置,你可以去玩玩。

3.2 数据请求及预处理

class HttpHelper
{
    static readonly string urlTemplate = "http://pan1234.com/server3?jsoncallback=jQuery191042552483269501273_1478315152726&q={0}&start={1}";
    public static SearchResult Requset(string key, string start)
    {
        string url = string.Format(urlTemplate, key, start);
        HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
        httpRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";
        httpRequest.Host = "pan1234.com";
        httpRequest.Referer = "http://pan.java1234.com/result.jsp?wp=0&op=0&ty=gn&q=" + Uri.EscapeUriString(key);
        try
        {
            HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
            Stream s = httpResponse.GetResponseStream();
            StreamReader sr = new StreamReader(s);
            string jsonString = sr.ReadToEnd();
            string jsonProcessed = null;
            if ((jsonProcessed = JsonPreProcessing(jsonString)) != null)
            {
                SearchResult searchResult = UtilityClass.GetObject<SearchResult>(jsonProcessed);
                return searchResult;
            }
            return null;
        }
        catch
        {
            return null;
        }
    }

    public static string JsonPreProcessing(string jsonString)
    {
        int startIndex = jsonString.IndexOf("(");
        if (startIndex > 0)
        {
            string json = jsonString.Substring(startIndex + 1);
            return "{"resources":" + json.Remove(json.Length - 3) + "}";
        }
        else
        {
            return null;
        }
    }
}

3.3 json数据反序列化对象

class UtilityClass
{
    public static T GetObject<T>(string json)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
        T obj = (T)serializer.ReadObject(ms);
        return obj;
    }
}

3.4 界面

界面设计如下:

图片 24

将网络请求的代码放到任务线程中进行执行。代码如下:

Thread thread = new Thread(() =>
{
    for (int i = 0; i < 100; i += 10)
    {
        if (isSearch)
        {
            SearchResult sr = HttpHelper.Requset(key, i.ToString());
            if (sr != null)
            {
                foreach (BDWPResource resource in sr.resources)
                {
                    BindResource(resource);
                }
            }
        }
        else break;
    }
    //搜索完成
    SearchOver();
});
thread.IsBackground = true;
thread.Start();

//绑定数据代码
private void BindResource(BDWPResource resource)
{
    string title = resource.title.Replace("</b>", "").Replace("<b>","");
    string content = resource.content.Replace("</b>", "").Replace("<b>", "");

    this.Invoke(new Action<string, string, string>((tle, ctt, url) => 
    {
        this.dataGridView1.Rows.Add(tle, ctt, url);
        this.lblResult.Text = (Int32.Parse(this.lblResult.Text) + 1).ToString();
        this.pgsBar.Value++;
    }), title, content, resource.unescapedUrl);
}
//搜索完成
private void SearchOver()
{
    this.Invoke(new Action(() => {
        this.btnSearch.Text = "开始搜索";
        this.btnSearch.Enabled = true;
        this.btnStop.Enabled = false;
        this.isSearch = true;
    }));
}

3.5 程序运行结果

图片 25

图片 26

4 结论

该程序搜索速度有时候比较慢,有时间快,刚开始点击搜索一般都要等一会才有结果,可能有网络延迟的原因。但发现搜索一会还没结果的时候,可以先停止搜索,然后再点击开始搜索,就会有搜索结果出来了。

5 资源

源代码下载链接:

编辑:编程 本文来源:前段时间发现了一个网站提供搜索百度网盘资源

关键词: