【问题标题】:Is it possible to capture search term from Google search?是否可以从 Google 搜索中捕获搜索词?
【发布时间】:2010-10-30 19:11:40
【问题描述】:

这可能是个愚蠢的问题,但是否有可能捕获用户在 Google 搜索框中输入的内容,然后可以将其用于在我的网站的登录页面上生成动态页面?

例如,假设有人在 Google 上搜索“热狗”,而我的网站作为搜索结果链接之一出现。如果用户单击将他们定向到我的网站的链接,我是否有可能以某种方式知道或从 Google 搜索框中捕获“热狗”文本,以便我可以调用一个脚本来搜索我的本地数据库的内容与热狗有关,然后展示呢?这对我来说似乎完全不可能,但我真的不知道。谢谢。

【问题讨论】:

  • 请注意,引荐来源网址可能会完全由客户一时兴起伪造或屏蔽。
  • 请注意,因为您是新手:不要这么快接受第一个答案。只是因为它有 1 票,并不意味着它是正确的
  • @TStamper:很好,感谢您的提示。我对我得到答案的速度感到非常兴奋。
  • 由于 2011 年末的 Google 安全更改,当搜索由已登录的 Google 用户执行时不再可能:googleblog.blogspot.com/2011/10/making-search-more-secure.htmlanalytics.blogspot.com/2011/10/…

标签: php html search http-referer


【解决方案1】:

是的,这是可能的。请参阅 HTTP 标头 Referer。 Referer 标头将包含 Google 搜索结果页面的 URL。

当用户点击 Google 搜索结果页面上的链接时,浏览器会使用这种 HTTP 标头向您的网站发出请求:

Referer: http://www.google.fi/search?hl=en&q=http+header+referer&btnG=Google-search&meta=&aq=f&oq=

只需从请求头解析 URL,用户使用的搜索词将在 q -参数中。上面示例中使用的搜索词是“http header referer”。

同样的方法通常也适用于其他搜索引擎,它们只是在 Referer 标头中有不同类型的 URL。

answer 展示了如何在 PHP 中实现它。


Referer 标头仅适用于 HTTP 1.1,但这几乎涵盖了任何现代浏览器。浏览器也可能会伪造Referer头或者完全丢失头,所以不要根据Referer头做出太严重的决定。

【讨论】:

【解决方案2】:

是的,它来自网址:

http://www.google.com/search?hl=es&q=hot+dog&lr=&aq=f&oq=

这是一个例子:

如果您想获取关键字,Google 会向您的网站发送许多访问者 他们过去常来您的网站,也许是为了给他们留下深刻印象 返回页面,或者只是将关键字存储在数据库中,这里是 我使用的 PHP 代码:

// take the referer
$thereferer = strtolower($_SERVER['HTTP_REFERER']);
// see if it comes from google
if (strpos($thereferer,"google")) {
    // delete all before q=
    $a = substr($thereferer, strpos($thereferer,"q="));     
    // delete q=
    $a = substr($a,2);
    // delete all FROM the next & onwards
    if (strpos($a,"&")) {
        $a = substr($a, 0,strpos($a,"&"));
    }   
    // we have the results.
    $mygooglekeyword = urldecode($a);
}

and we can use <?= $mygooglekeywords ?> when we want to output the
keywords.

【讨论】:

  • 哇,谢谢大家。我是一个谦虚的新手。我四分钟前发布了我的问题并得到了三个有用的回复。堆栈溢出规则!
  • 有比这更好的方法。 PHP 有一个内置函数来解析一个 url。 parse_url, parse_str 做了这 3 行。
【解决方案3】:

您可以获取引用 URL 并从查询字符串中获取搜索词。搜索将在查询中显示为“q=searchTerm”,其中 searchTerm 是您想要的文本。

【讨论】:

    【解决方案4】:

    我会这样做

    $referringPage = parse_url( $_SERVER['HTTP_REFERER'] );
    if ( stristr( $referringPage['host'], 'google.' ) )
    {
      parse_str( $referringPage['query'], $queryVars );
      echo $queryVars['q']; // This is the search term used
    }
    

    【讨论】:

    • +1 使代码与国际谷歌域名(google.fi、google.de 等)和谷歌图片搜索兼容。
    • 谢谢!我认为这里仍有可能出现误报 - google.domain.com 的某人 - 但这只是一个例子。您可以通过检查 $referringPage['path'] 的值来收紧它,然后对 $queryVars['q'] 进行简单的 isset() 检查
    • 使用 preg_match("/google\.[az]{2,4}$/i", $referringPage['host']) 代替 stristr() 来阻止 google.domain.com上述案例
    • 这是一个很好的尝试嗖嗖,我其实也想过,但后来我想起了这个:google.co.uk ;)
    • @Peter Bailey,我认为误报并不重要。浏览器无论如何都可以伪造此标头。
    【解决方案5】:

    同样的事情,但有一些错误处理

    <?php
    if (@$_SERVER['HTTP_REFERER']) {
        $referringPage = parse_url($_SERVER['HTTP_REFERER']);
        if (stristr($referringPage['host'], 'google.')) {
            parse_str( $referringPage['query'], $queryVars );
            $google = $queryVars['q'];
            $google = str_replace("+"," ",$google); }
        else { $google = false; }}
    else { $google = false; }
    
    if ($google) { echo "You searched for ".$google." at Google then came here!"; }
    else { echo "You didn't come here from Google"; }
    ?>
    

    【讨论】:

      【解决方案6】:

      对不起,还有一点
      添加对 Bing、Yahoo 和 Altavista 的支持

      <?php
      if (@$_SERVER['HTTP_REFERER']) {
          $referringPage = parse_url($_SERVER['HTTP_REFERER']);
          if (stristr($referringPage['host'], 'google.')
              || stristr($referringPage['host'], 'bing.')
              || stristr($referringPage['host'], 'yahoo.')) {
                  parse_str( $referringPage['query'], $queryVars );
                  if (stristr($referringPage['host'], 'google.')
                      || stristr($referringPage['host'], 'bing.')) { $search = $queryVars['q']; }
                              else if (stristr($referringPage['host'], 'yahoo.')) { $search =     $queryVars['p']; }
                              else { $search = false; }
                  if ($search) { $search = str_replace("+"," ",$search); }}
                  else { $search = false; }}
      else { $search = false; }
      if ($search) { echo "You're in the right place for ".$search; }
      ?>
      

      【讨论】:

      • 注:altavista 似乎归 yahoo 所有,当您使用它搜索时,您会被重定向到 yahoo 搜索页面,因此搜索 yahoo。在标题中涵盖了两个搜索引擎
      【解决方案7】:

      这是一个老问题,自从提出并回答了原始问题以来,答案已经改变。自 2011 年 10 月起,Google 将为登录 Google 帐户的任何人加密此推荐信息:http://googleblog.blogspot.com/2011/10/making-search-more-secure.html

      对于未登录 Google 的用户,搜索关键字仍然可以在推荐 URL 中找到,并且上述答案仍然适用。但是,对于经过身份验证的 Google 用户,网站无法查看他们的搜索关键字。

      但是,通过创建专门的目标网页,仍然可以做出明智的猜测。 (“赫特人贾巴庄严的炭笔素描”页面的访问者可能......嗯,疯了。)

      【讨论】:

        【解决方案8】:

        这是一个老问题,但我发现谷歌不再给出查询词,因为它默认将每个用户重定向到 https,这不会给你“q”参数。除非有人使用 http (http://google.com) 手动输入 google url 然后搜索,否则目前无法获取“q”参数。

        【讨论】:

        • 这是我害怕找到的答案。我注意到我的搜索跟踪现在没有任何搜索字词,这一定是原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多