关于作者

  • 马隆博(Lenbo Ma),Java,Javascript
  • Blog: http://mlongbo.com
  • E-Mail: mlongbo@gmail.com
  • 文章编写于: 2014/08/09

转载请注明出处:

http://mlongbo.com/wo-shi-ru-he-jian-li-ge-googlesou-suo-dai-li-fu-wu-de/


前言

当初要写gso的初衷是因为我女朋友她要写论文查资料,但我又不在她身边没办法给她翻墙用Google,所以就有了写一个Google搜索代理的想法。

如果刚好你也有个VPS,完全可以自己部署一个服务,这样大家就有更多的Google可以用。希望我们能够通过这种方式让更多的人获取知识,并且认识这个世界。

原理

前提是要一定将其部署在GFW之外,能正常访问Google的地方。gso的实现原理非常简单,分别为以下几步:

  1. 发起查询请求;
  2. gso服务器接收到查询关键词;
  3. gso向Google发起查询请求;
  4. 接收到Google响应的数据;
  5. 解析数据并重新渲染响应给用户;

实现

Node.js版:

/**
* @author Longbo Ma
*/
var request = require('request');
var zlib = require('zlib');
var $ = require('jQuery');
var gsearch = function (options, cb) {
options = options || {};
this.start = options.start || 0;
this.q = options.q;
this.callback = cb || function(s){};
this.result = {
q: this.q,
start: this.start
};
this.config = {
base_url: "https://www.google.com",
lang: "zh-CN"
};
};
gsearch.prototype.parseResponse = function (body) {
var arr = [];
var search = $(body).find("#search").find("li[class='g']");
var resultStats = $(body).find("#resultStats").html() || "";
search.each(function () {
var h3 = $(this).find("h3.r");
var link = h3.find('a');
var url = link.attr("href");
if (url && url.indexOf('/search?') != 0) {
var title = link.html();
var content = $(this).find("span.st").text();
var cite = $(this).find("cite").html();
arr.push({
title: title, //搜索结果项标题
url: url,
cite: cite,
content: content //搜索结果简要说明
});
}
});
this.result['resultStats'] = resultStats; //“搜索结果用时”文字
this.result['data'] = arr;
};
gsearch.prototype.render = function (body) {
this.parseResponse(body);
this.callback(this.result);
};
/**
* 发起查询请求
*/
gsearch.prototype.request = function () {
var self = this;
if (!this.q) {
cb([]);
return;
}
var qs = {
start: this.start,
q: this.q,
hl: this.config.lang
};
var headers = {
'connection': 'keep-alive',
'accept-encoding': 'gzip,deflate,sdch',
'accept-language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'referer': this.config.base_url
};
var options = {
url: this.config.base_url+'/search',
encoding: null,
headers: headers,
qs: qs
};
request(options, function (err, res, body) {
if (!err && res.statusCode==200) {
var res_encoding  = res.headers['content-encoding'];
if (res_encoding.indexOf("gzip")  >= 0) {
zlib.unzip(body, function(err, buffer) { //gzip解压缩
body =  buffer.toString();
self.render(body);
});
} else {
self.render(body);
}
}
});
};
module.exports = function (options,cb) {
new gsearch(options,cb).request();
};

使用:

查询第二页关于“java”的搜索结果

gsearch({
q: 'java',
start: 10
}, function (res){
console.log(res);
});

结语

整个实现过程非常简单,甚至会让人觉得没有技术含量。但我认为衡量一个应用的价值并非在于技术含量,而要看它是否有用,是否能够产生价值。

希望我们都能做出很多有意思并且有用的应用出来。

你如果对这个项目感兴趣,可以看看GitHub代码。
我搭建了一个服务,也可以点击 这里预览

相关知识

资料整理自互联网

以下是一些可能会用到的请求参数:

  • q: 查询关键词,必需的参数,其它都是可选;

  • start: 显示搜索结果的起始端,缺省为0;

    如果你想直接看搜索结果第2页,让start=10即可,由于Google只显示1000条搜索结果记录,start理论取值范围在0--999之间。

  • num: 搜索结果显示条数,取值范围在10--100条之间,缺省设置num=10;

  • hl: Google搜索的界面语言,建议设置为zh-CN;

    因为我的vps在日本,起初我没有设置这个参数,当查询中文时,便出现了大量日文搜索结果。

    hl=zh-CN简体中文语言界面

    hl=zh-TW繁体中文语言界面

    hl=en-英文语言界面

  • lr: 搜索内容的语言限定,限定只搜索某种语言的网页。缺省为搜索所有网页。

    常用的有:

    lr=lang_zh-CN 只搜索简体中文网页

    lr=lang_zh-TW 只搜索繁体中文网页

    lr=lang_zh-CN|lang_zh-TW 搜索所有中文网页

    lr=lang_en 只搜索英文网页

  • ie: 查询关键词的编码,缺省设置为utf-8,也就是说请求Google搜索时参数q的值是一段utf-8编码的文字。

  • oe: 搜索结果页面的网页编码,缺省设置oe=utf-8

我是如何建立一个Google代理搜索服务(GuSou)的相关推荐

  1. 机器人坐标系建立_如何在30分钟内建立一个简单的搜索机器人

    机器人坐标系建立 by Quinn Langille 奎因·兰吉尔(Quinn Langille) 如何在30分钟内建立一个简单的搜索机器人 (How to Build A Simple Search ...

  2. 在博客中自定义Google代理搜索

    直接访问Google可能有些问题,可以利用博客插件,进行代理性质的搜索, 大家试试下面的这个,看看搜索效果如何 Google代理自定义搜索 技术性的知识搜索,还是需要Google的,尤其是外文的资料! ...

  3. 一个IP地址搜索服务

    今天偶然发现了有道德ip地址搜索服务,网址是: http://www.youdao.com/smartresult-xml/search.s?type=ip&q=10.213.28.0 这个页 ...

  4. 9月6日科技联播:Google推出了新的搜索服务,王者荣耀将启动最严格实名策略...

    Google推出Dataset Search,数据工作者的又一"神器",王者荣耀启动最严实名制,游戏行业与公安权威数据的首次合作:乐视和京东,一个涨幅异常遭停牌,一个大跌股价半路腰 ...

  5. 上传应用程序到谷歌商店_将Google图书搜索集成到PHP应用程序中

    上传应用程序到谷歌商店 常用缩略语 API:应用程序编程接口 DOM:文档对象模型 HTTP:超文本传输​​协议 HTML:超文本标记语言 ISBN:国际标准书号 REST:代表性状态转移 URL:统 ...

  6. Python Google内购服务端验证

    Google内购完成后,服务端需要校验订单的状态是否正确(是否已经成功付款). 一.申请认证 参考https://developers.google.cn/android-publisher/gett ...

  7. 目前Google推出的服务(ZZ)

    http://blog.ouc.edu.cn/netdata/ Google每次推出的新服务总会给人带来新意,不过你知道Google一共推出了多少服务吗? Google这个公司现在已经是"家 ...

  8. 【阿里云产品公测】高大上的搜索服务OpenSearch, 你值得拥有!

    2019独角兽企业重金招聘Python工程师标准>>> [阿里云产品公测]高大上的搜索服务OpenSearch, 你值得拥有! 作者:阿里云用户trcher 一.前言:  在Open ...

  9. 两虎相争将带来优质的互联网搜索服务 --- 我看Google归来!

    两虎相争将带来优质的互联网搜索服务 --- 我看Google归来! 近期盛传Google重新进入中国市场,尤其是其互联网搜索业务.包括笔者在内的众多中国网民对此很是兴奋,大家很期待google重新归来 ...

最新文章

  1. linux下cuda与cudnn安装
  2. 【错误记录】Android Studio 向 GitHub 提交代码报错 ( Push failed: Failed with error: Could not read | 使用命令行提交代码 )
  3. AVPlayer播放视频
  4. idea 内存溢出解决方法
  5. 第七章 递推与递归 第3课 攀天梯(ladder) --《聪明人的游戏:信息学探秘.提高篇》
  6. 中台唯一的胜利果实:大数据中台架构详解
  7. java压缩文件能否不压缩路径_如何在Java中压缩文件而不包含文件路径
  8. Sublime Text3搭建go运行环境
  9. 并行开发 4.同步机制(上)
  10. 「14」支持向量机——我话说完,谁支持?谁反对?
  11. 提高网站访问速度的方法汇总
  12. spring 中beanFactory和ApplicationContext的区别
  13. AxureRP8.1(注册码)破解汉化教程
  14. 三种近场通信的特点,以及未来近场通信技术的应用场景的分析和预测
  15. js实现扫雷-算法分析
  16. Android原生拼音输入法分析
  17. html怎么设计关键字,干货分享——关键词如何做标记
  18. npm(了解)+Babel转码器+模块化+webpack打包
  19. 建议收藏:GitHub 上值得收藏的100个精选前端项目!
  20. 算法:快速排序稳定性

热门文章

  1. OTA近场测量你真的了解吗?
  2. stm32 火灾自动报警及联动控制源码_火灾报警控制器、消防联动控制器的区别及应用...
  3. image 转换 pdf
  4. 树莓派高清图传教程2——基本参数设置
  5. python音乐可视化_Python数据可视化:网易云音乐歌单
  6. 华为设备命令控制台的快捷键
  7. 城市动能转换_动能转换 驱动发展
  8. palo alto 3020防火墙NAT映射配置
  9. 【无标题】软件工程是不是教会不怎么会写程序的人开发软件?
  10. 基于Java语言的面向对象基础算法的练习