如何在Google应用脚本的urlfetch中获取Google搜索结果

9
我一直在尝试以下代码:
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"));

但它似乎只返回标题,空的正文以及没有搜索结果。至少我应该能够在浏览器顶部看到“大约xxx个结果”,但这不会出现在文本中,indexOf也没有返回正数。我想知道搜索结果是否在页面加载后生成,这意味着正文标签确实是空的,如果是这样,是否有一种解决方法?
编辑:不,它不会违反TOS,因为这是一个GAFE应用程序(即商业应用程序),对于企业帐户,他们可以免费或付费访问API的高级模型。

通过在Chrome中进行调试(查看GET / POST网络调用等),了解Google页面的操作。可能会执行ajax,因此您可以从gas执行相同的调用。 - Zig Mandel
检查是否直接调用违反了他们的服务条款。 - Zig Mandel
1个回答

20

谷歌提供了授权搜索的API,因此不需要烦恼地进行网页抓取。

例如,您可以使用自定义搜索APIUrlFetch()

从脚本编辑器中,进入资源-> 开发者控制台项目... -> 查看开发者控制台。创建一个新的密钥用于公共API访问。按照自定义搜索API文档中的说明创建自定义搜索引擎。将密钥和ID输入到指定的脚本位置中。(更多细节见下文。)

这个示例脚本将返回一个包含成功搜索结果的对象;您可以浏览对象以获取您想要的任何信息。

/**
 * 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应用程序

(摘自Google文档)

  1. 进入Google开发者控制台

  2. 选择一个项目或创建一个新项目。

    截图

  3. 在左侧的侧边栏中,展开API和身份验证。接下来,单击API。在API列表中,请确保自定义搜索API的状态为启用。

    截图2

    . . .

    截图3

  4. 在左侧的侧边栏中,选择凭据

    通过在公共API访问下单击创建新密钥来创建应用程序的API密钥。对于Google Script使用,请创建一个浏览器密钥

  5. 一旦创建了浏览器应用程序密钥,请将API密钥复制到您的代码中。

创建自定义搜索引擎

按照此处的说明进行操作。创建自定义搜索引擎后,请将搜索引擎ID复制到您的代码中。


感谢您提供这个用户友好的逐步说明...我喜欢它 :-) - Serge insas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接