如何在 google 应用程序脚本中从 urlfetch 获取 Google 搜索结果
How do I get Google search results from urlfetch in google apps script
我一直在尝试下面的代码
var response = UrlFetchApp.fetch("https://www.google.com/#q=this+is+a+test");
var contentText = response.getContentText();
Logger.log(contentText);
var thisdoc=DocumentApp.getActiveDocument().getBody() ;
thisdoc.setText(contentText);
Logger.log(contentText.indexOf("About"));
但似乎只有return header 和空body 和none 的搜索结果。至少我应该能够在浏览器的顶部看到 "About xxx results",但这没有出现在文本中,indexOf return 也没有出现在正面屏幕上。我想知道搜索结果是否已填充 post 页面加载,这意味着 body 标记确实为空,如果是,是否有解决方法?
编辑:不,它不会违反 TOS,因为这是一个 GAFE 应用程序(这是一个商业应用程序),对于商业帐户,他们有免费和高级模式访问他们的 API。
Google 为授权搜索提供 API,所以不要为抓取网页而大惊小怪。
例如,您可以将 Custom Search API 与 UrlFetch()
一起使用。
从脚本编辑器转到 Resources -> Developer's Console Project... -> View Developer's Console
。为 Public API 访问创建新密钥。按照自定义搜索 API 文档中的说明创建自定义搜索引擎。在指定的脚本中输入密钥和 ID。 (下面有更多详细信息。)
此示例脚本将 return 包含成功搜索结果的对象;您可以导航对象以提取所需的任何信息。
/**
* Use Google's customsearch API to perform a search query.
* See https://developers.google.com/custom-search/json-api/v1/using_rest.
*
* @param {string} query Search query to perform, e.g. "test"
*
* returns {object} See response data structure at
* https://developers.google.com/custom-search/json-api/v1/reference/cse/list#response
*/
function searchFor( query ) {
// Base URL to access customsearch
var urlTemplate = "https://www.googleapis.com/customsearch/v1?key=%KEY%&cx=%CX%&q=%Q%";
// Script-specific credentials & search engine
var ApiKey = "--get from developer's console--";
var searchEngineID = "--get from developer's console--";
// Build custom url
var url = urlTemplate
.replace("%KEY%", encodeURIComponent(ApiKey))
.replace("%CX%", encodeURIComponent(searchEngineID))
.replace("%Q%", encodeURIComponent(query));
var params = {
muteHttpExceptions: true
};
// Perform search
Logger.log( UrlFetchApp.getRequest(url, params) ); // Log query to be sent
var response = UrlFetchApp.fetch(url, params);
var respCode = response.getResponseCode();
if (respCode !== 200) {
throw new Error ("Error " +respCode + " " + response.getContentText());
}
else {
// Successful search, log & return results
var result = JSON.parse(response.getContentText());
Logger.log( "Obtained %s search results in %s seconds.",
result.searchInformation.formattedTotalResults,
result.searchInformation.formattedSearchTime);
return result;
}
}
示例:
[15-05-04 18:26:35:958 EDT] {
"headers": {
"X-Forwarded-For": "216.191.234.70"
},
"useIntranet": false,
"followRedirects": true,
"payload": "",
"method": "get",
"contentType": "application/x-www-form-urlencoded",
"validateHttpsCertificates": true,
"url": "https://www.googleapis.com/customsearch/v1?key=--redacted--&cx=--redacted--&q=test"
}
[15-05-04 18:26:36:812 EDT] Obtained 132,000,000 search results in 0.74 seconds.
使用 API 密钥
将您的应用程序标识到 Google
Select一个项目,或者创建一个新项目。
在左侧边栏中,展开APIs & auth。接下来,单击 APIs。在 API 的列表中,确保 自定义搜索 API.
的状态为开启
。 . .
在左侧边栏中,select Credentials.
通过单击 Public API 访问[=80= 下的 创建新密钥 创建应用程序的 API 密钥].对于 Google 脚本使用,创建一个 浏览器密钥 。
创建浏览器应用程序密钥后,将API密钥复制到您的代码中.
创建自定义搜索引擎
按照说明进行操作 here。创建自定义搜索引擎后,将搜索引擎 ID 复制到您的代码中。
我一直在尝试下面的代码
var response = UrlFetchApp.fetch("https://www.google.com/#q=this+is+a+test");
var contentText = response.getContentText();
Logger.log(contentText);
var thisdoc=DocumentApp.getActiveDocument().getBody() ;
thisdoc.setText(contentText);
Logger.log(contentText.indexOf("About"));
但似乎只有return header 和空body 和none 的搜索结果。至少我应该能够在浏览器的顶部看到 "About xxx results",但这没有出现在文本中,indexOf return 也没有出现在正面屏幕上。我想知道搜索结果是否已填充 post 页面加载,这意味着 body 标记确实为空,如果是,是否有解决方法?
编辑:不,它不会违反 TOS,因为这是一个 GAFE 应用程序(这是一个商业应用程序),对于商业帐户,他们有免费和高级模式访问他们的 API。
Google 为授权搜索提供 API,所以不要为抓取网页而大惊小怪。
例如,您可以将 Custom Search API 与 UrlFetch()
一起使用。
从脚本编辑器转到 Resources -> Developer's Console Project... -> View Developer's Console
。为 Public API 访问创建新密钥。按照自定义搜索 API 文档中的说明创建自定义搜索引擎。在指定的脚本中输入密钥和 ID。 (下面有更多详细信息。)
此示例脚本将 return 包含成功搜索结果的对象;您可以导航对象以提取所需的任何信息。
/**
* Use Google's customsearch API to perform a search query.
* See https://developers.google.com/custom-search/json-api/v1/using_rest.
*
* @param {string} query Search query to perform, e.g. "test"
*
* returns {object} See response data structure at
* https://developers.google.com/custom-search/json-api/v1/reference/cse/list#response
*/
function searchFor( query ) {
// Base URL to access customsearch
var urlTemplate = "https://www.googleapis.com/customsearch/v1?key=%KEY%&cx=%CX%&q=%Q%";
// Script-specific credentials & search engine
var ApiKey = "--get from developer's console--";
var searchEngineID = "--get from developer's console--";
// Build custom url
var url = urlTemplate
.replace("%KEY%", encodeURIComponent(ApiKey))
.replace("%CX%", encodeURIComponent(searchEngineID))
.replace("%Q%", encodeURIComponent(query));
var params = {
muteHttpExceptions: true
};
// Perform search
Logger.log( UrlFetchApp.getRequest(url, params) ); // Log query to be sent
var response = UrlFetchApp.fetch(url, params);
var respCode = response.getResponseCode();
if (respCode !== 200) {
throw new Error ("Error " +respCode + " " + response.getContentText());
}
else {
// Successful search, log & return results
var result = JSON.parse(response.getContentText());
Logger.log( "Obtained %s search results in %s seconds.",
result.searchInformation.formattedTotalResults,
result.searchInformation.formattedSearchTime);
return result;
}
}
示例:
[15-05-04 18:26:35:958 EDT] {
"headers": {
"X-Forwarded-For": "216.191.234.70"
},
"useIntranet": false,
"followRedirects": true,
"payload": "",
"method": "get",
"contentType": "application/x-www-form-urlencoded",
"validateHttpsCertificates": true,
"url": "https://www.googleapis.com/customsearch/v1?key=--redacted--&cx=--redacted--&q=test"
}
[15-05-04 18:26:36:812 EDT] Obtained 132,000,000 search results in 0.74 seconds.
使用 API 密钥
将您的应用程序标识到 GoogleSelect一个项目,或者创建一个新项目。
在左侧边栏中,展开APIs & auth。接下来,单击 APIs。在 API 的列表中,确保 自定义搜索 API.
的状态为开启。 . .
在左侧边栏中,select Credentials.
通过单击 Public API 访问[=80= 下的 创建新密钥 创建应用程序的 API 密钥].对于 Google 脚本使用,创建一个 浏览器密钥 。
创建浏览器应用程序密钥后,将API密钥复制到您的代码中.
创建自定义搜索引擎
按照说明进行操作 here。创建自定义搜索引擎后,将搜索引擎 ID 复制到您的代码中。