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

时间:2011-03-31 21:27:12

标签: bash

使用脚本语言解析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脚本?如果你只是卷曲了API页面,你应该如何编码URL参数或解析JSON?

6 个答案:

答案 0 :(得分:6)

我最终使用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",//'

答案 1 :(得分:4)

@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

答案 2 :(得分:3)

多年后,您可以安装googler

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

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

要获取网址,只需将其传输到:

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

答案 3 :(得分:1)

未经测试的方法,因为我目前无法访问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的“我感觉很幸运”的功能,为您赢得第一个网址。你也许可以清理一下上面的网址。

答案 4 :(得分:1)

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

它并不像我想的那样紧凑,而是匆忙。

答案 5 :(得分:1)

仅供参考:到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