刮刮谷歌 - 可检索的结果数量与总数不匹配

时间:2012-05-07 13:37:38

标签: python web-crawler google-search

我想用python获取谷歌搜索结果,到目前为止我有以下脚本,我从这里学到了post

import urllib2
from bs4 import BeautifulSoup
import lxml
import sqlite3
import urllib
import json

def showSome(searchFor):
    query = urllib.urlencode({'q':searchFor})
    url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s'%query
    searchResponse = urllib.urlopen(url)
    searchResults = searchResponse.read()
    results = json.loads(searchResults)
    data = results['responseData']
    print 'Total results: %s'%data['cursor']['estimatedResultCount']
    hits = data['results']
    print 'Top %d hits'%len(hits)
    for h in hits:
        print ' ', h['url']

showSome("site:www.hitmeister.de/shops/")

它显示了4380个结果,当我使用浏览器搜索相同的查询时,它给了我大约6650个结果,我如何从谷歌中提取所有结果? 而且这也给了我前4个结果,我如何获取所有结果?

2 个答案:

答案 0 :(得分:2)

这里的问题是谷歌估计的结果数量总是估计值,仅此而已。这些估算可能会因许多因素而异,显然包括您是通过API还是通过网络浏览器进行搜索。实际上,当您从同一系统上的不同浏览器运行相同的查询时,Google并不知道返回不同的估计值。这或许可以通过不同的服务器回答您的查询来解释,但我对此表示怀疑,并且谷歌肯定会考虑搜索上下文。

另请参阅this short pieceGoogle documentation on the subject。虽然该附录似乎是专为Google Search Appliance编写的,但它很好地描述了这些结果的准确性。

实际上,Google无论如何都不会为查询返回超过1,000次点击,因此无论初始估算如何,您都无法获得查询的所有结果。至少,我没有尝试从API请求超过1000个结果,但这是Web界面的行为,我认为API具有相同的限制。

答案 1 :(得分:1)

Google非常复杂,结果不是取决于许多不同的参数。

例如,如果我在google.co.uk上搜索字词,则会得到与google.com不同的结果。

对于不同的用户代理和Cookie,此行为也可能相同(例如,因为您在Cookie中设置了不同的语言)。

非常重要的是,结果计数不准确。这只是对谷歌搜索的估计。如果你想改变这种行为,我会尝试通过ajax注入相同的参数,你注入了正常的搜索(包括cookie等)。

最终我的反问题是:你为什么需要这个?这个计数大部分时间都不准确,因为计数器只是一个估计。更重要的是最高结果是否相同的问题。如果情况并非如此,我认为这将是一个问题。