在 shell 脚本中获取第一个 Google 搜索结果的 URL

Posted

技术标签:

【中文标题】在 shell 脚本中获取第一个 Google 搜索结果的 URL【英文标题】:Getting the URLs for the first Google search results in a shell script 【发布时间】:2011-07-27 06:24:29 【问题描述】:

使用脚本语言解析 AJAX API 的输出相对容易:

#!/usr/bin/env python

import urllib
import json

base = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&'
query = urllib.urlencode('q' : "something")
response = urllib.urlopen(base + query).read()
data = json.loads(response)
print data['responseData']['results'][0]['url']

但是有没有更好的方法来做类似的事情只用基本的 shell 脚本?如果只是 curl API 页面,应该如何编码 URL 参数或解析 JSON?

【问题讨论】:

你当前的转义有问题吗?我认为使用 urlencode 没有任何问题。 @Xepo 只是它依赖于 Python。但基于URLEncode from a bash script - Stack Overflow,它确实似乎是最合理的方法之一。 @Lri 这是 bash 还是 pyton 问题?请考虑删除 [bash] 标签 @nhed 我正在尝试用 bash 脚本替换 Python 示例。 也许只使用googlecl 【参考方案1】:

我最终使用 curl 的 --data-urlencode 选项对查询参数进行编码,并使用 sed 提取第一个结果。

curl -s --get --data-urlencode "q=example" http://ajax.googleapis.com/ajax/services/search/web?v=1.0 | sed 's/"unescapedUrl":"\([^"]*\).*/\1/;s/.*GwebSearch",//'

【讨论】:

这个解决方案似乎只为我返回 4 个结果中的最后一个 The Google Web Search API is no longer available. Please migrate to the Google Custom Search API (https://developers.google.com/custom-search/)【参考方案2】:

@Lri - 这是我个人用于命令行工具和脚本的脚本。它使用命令行实用程序“lynx”来转储 URL。脚本可以从HERE 下载,代码视图是HERE。 这是代码供您参考,

#!/bin/bash

clear
echo ""
echo ".=========================================================."
echo "|                                                         |"
echo "|  COMMAND LINE GOOGLE SEARCH                             |"
echo "|  ---------------------------------------------------    |"
echo "|                                                         |"
echo "|  Version: 1.0                                           |"
echo "|  Developed by: Rishi Narang                             |"
echo "|  Blog: www.wtfuzz.com                                   |"
echo "|                                                         |"
echo "|  Usage: ./gocmd.sh <search strings>                     |"
echo "|  Example: ./gocmd.sh example and test                   |"
echo "|                                                         |"
echo ".=========================================================."
echo ""

if [ -z $1 ]
then
 echo "ERROR: No search string supplied."
 echo "USAGE: ./gocmd.sh <search srting>"
 echo ""
 echo -n "Anyways for now, supply the search string here: "
 read SEARCH
else
 SEARCH=$@
fi

URL="http://google.com/search?hl=en&safe=off&q="
STRING=`echo $SEARCH | sed 's/ /%20/g'`
URI="$URL%22$STRING%22"

lynx -dump $URI > gone.tmp
sed 's/http/\^http/g' gone.tmp | tr -s "^" "\n" | grep http| sed 's/\ .*//g' > gtwo.tmp
rm gone.tmp
sed '/google.com/d' gtwo.tmp > urls
rm gtwo.tmp

echo "SUCCESS: Extracted `wc -l urls` and listed them in '`pwd`/urls' file for reference."
echo ""
cat urls
echo ""

#EOF

【讨论】:

【参考方案3】:

多年后,你可以安装googler

googler -n 1 -c in -l en search something here --json

您可以使用 n 标志控制输出页面的数量。

要仅获取 url,只需将其通过管道传输到:

grep "\"url\""|tr -s ' ' |cut -d ' ' -f3|tr -d "\""

【讨论】:

只提取 URL 的更简单方法是通过 jq: jq -r '.[].url'【参考方案4】:

未经测试的方法,因为我目前无法访问 unix 机器...

假设“test”是查询字符串,您可以在以下网址上使用简单的 wget http://www.google.co.in/#hl=en&source=hp&biw=1280&bih=705&q=test&btnI=Google+Search&aq=f&aqi=g10&aql=&oq=test&fp=3cc29334ffc8c2c

这将利用 Google 的“我感觉很幸运”功能并为您获取第一个网址。您也可以稍微清理一下上面的网址。

【讨论】:

谢谢,在没有 biwbihfp 参数的情况下为我工作。 是的,只有 btnI 参数似乎是相关的。这适用于我作为单行 #!/bin/sh shell 脚本,我将搜索限制为 developer.mozilla.org(可能不是您的用例,但无论如何 - 我将其保存为“jsdoc”) :exec firefox "https://www.google.com/search?btnI=Google+Search&amp;q=site%3Adeveloper.mozilla.org+$1"【参考方案5】:

Lri 的回答只为我返回了最后一个结果,我需要顶部,所以我将其更改为:

JSON=$(curl -s --get --data-urlencode "q=QUERY STRING HERE" http://ajax.googleapis.com/ajax/services/search/web?v=1.0 | python -mjson.tool)
response=$(echo "$JSON" | sed -n -e 's/^.*responseStatus\": //p')
if [ $response -eq 200 ] ; then 
    url=$(echo "$JSON" | egrep "unescapedUrl" | sed -e '1!d' -e "s/^.*unescapedUrl\": \"//" -e "s/\".*$//")
    echo "Success! [$url]"
    wget $url;
else 
    echo "FAILED! [$response]" 
fi

它不像我想要的那样紧凑,但很匆忙。

【讨论】:

【参考方案6】:

仅供参考:到 2013 年 11 月,您将需要完全替换 ajax.googleapis.com/ajax/services/search/web 调用。

很可能,它必须被自定义搜索引擎 (CSE) 取代。问题是您将无法从 CSE 获得“全局”结果。这是一个很好的提示:http://groups.google.com/a/googleproductforums.com/d/msg/customsearch/0aoS-bXgnEM/lwlZ6_IyVDQJ。

【讨论】:

以上是关于在 shell 脚本中获取第一个 Google 搜索结果的 URL的主要内容,如果未能解决你的问题,请参考以下文章

Linux常用脚本命令总结

shell获取第10+个位置参数

shell程序中怎么获取调用参数?

shell调用mapreduce结束后无法获取结束状态

利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集

shell脚本中的数组常见使用方式