在 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 的“我感觉很幸运”功能并为您获取第一个网址。您也可以稍微清理一下上面的网址。
【讨论】:
谢谢,在没有biw
、bih
和 fp
参数的情况下为我工作。
是的,只有 btnI 参数似乎是相关的。这适用于我作为单行 #!/bin/sh shell 脚本,我将搜索限制为 developer.mozilla.org(可能不是您的用例,但无论如何 - 我将其保存为“jsdoc”) :exec firefox "https://www.google.com/search?btnI=Google+Search&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的主要内容,如果未能解决你的问题,请参考以下文章