我是如何建立一个Google代理搜索服务(GuSou)的
关于作者
- 马隆博(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的实现原理非常简单,分别为以下几步:
- 发起查询请求;
- gso服务器接收到查询关键词;
- gso向Google发起查询请求;
- 接收到Google响应的数据;
- 解析数据并重新渲染响应给用户;
实现
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)的相关推荐
- 机器人坐标系建立_如何在30分钟内建立一个简单的搜索机器人
机器人坐标系建立 by Quinn Langille 奎因·兰吉尔(Quinn Langille) 如何在30分钟内建立一个简单的搜索机器人 (How to Build A Simple Search ...
- 在博客中自定义Google代理搜索
直接访问Google可能有些问题,可以利用博客插件,进行代理性质的搜索, 大家试试下面的这个,看看搜索效果如何 Google代理自定义搜索 技术性的知识搜索,还是需要Google的,尤其是外文的资料! ...
- 一个IP地址搜索服务
今天偶然发现了有道德ip地址搜索服务,网址是: http://www.youdao.com/smartresult-xml/search.s?type=ip&q=10.213.28.0 这个页 ...
- 9月6日科技联播:Google推出了新的搜索服务,王者荣耀将启动最严格实名策略...
Google推出Dataset Search,数据工作者的又一"神器",王者荣耀启动最严实名制,游戏行业与公安权威数据的首次合作:乐视和京东,一个涨幅异常遭停牌,一个大跌股价半路腰 ...
- 上传应用程序到谷歌商店_将Google图书搜索集成到PHP应用程序中
上传应用程序到谷歌商店 常用缩略语 API:应用程序编程接口 DOM:文档对象模型 HTTP:超文本传输协议 HTML:超文本标记语言 ISBN:国际标准书号 REST:代表性状态转移 URL:统 ...
- Python Google内购服务端验证
Google内购完成后,服务端需要校验订单的状态是否正确(是否已经成功付款). 一.申请认证 参考https://developers.google.cn/android-publisher/gett ...
- 目前Google推出的服务(ZZ)
http://blog.ouc.edu.cn/netdata/ Google每次推出的新服务总会给人带来新意,不过你知道Google一共推出了多少服务吗? Google这个公司现在已经是"家 ...
- 【阿里云产品公测】高大上的搜索服务OpenSearch, 你值得拥有!
2019独角兽企业重金招聘Python工程师标准>>> [阿里云产品公测]高大上的搜索服务OpenSearch, 你值得拥有! 作者:阿里云用户trcher 一.前言: 在Open ...
- 两虎相争将带来优质的互联网搜索服务 --- 我看Google归来!
两虎相争将带来优质的互联网搜索服务 --- 我看Google归来! 近期盛传Google重新进入中国市场,尤其是其互联网搜索业务.包括笔者在内的众多中国网民对此很是兴奋,大家很期待google重新归来 ...
最新文章
- linux下cuda与cudnn安装
- 【错误记录】Android Studio 向 GitHub 提交代码报错 ( Push failed: Failed with error: Could not read | 使用命令行提交代码 )
- AVPlayer播放视频
- idea 内存溢出解决方法
- 第七章 递推与递归 第3课 攀天梯(ladder) --《聪明人的游戏:信息学探秘.提高篇》
- 中台唯一的胜利果实:大数据中台架构详解
- java压缩文件能否不压缩路径_如何在Java中压缩文件而不包含文件路径
- Sublime Text3搭建go运行环境
- 并行开发 4.同步机制(上)
- 「14」支持向量机——我话说完,谁支持?谁反对?
- 提高网站访问速度的方法汇总
- spring 中beanFactory和ApplicationContext的区别
- AxureRP8.1(注册码)破解汉化教程
- 三种近场通信的特点,以及未来近场通信技术的应用场景的分析和预测
- js实现扫雷-算法分析
- Android原生拼音输入法分析
- html怎么设计关键字,干货分享——关键词如何做标记
- npm(了解)+Babel转码器+模块化+webpack打包
- 建议收藏:GitHub 上值得收藏的100个精选前端项目!
- 算法:快速排序稳定性