2

我试图使用xgoogle,但我已经 3 年没有更新了,即使我每页设置 100 个结果,我也只能得到不超过 5 个结果。如果有人使用 xgoogle 没有任何问题,请告诉我。

现在,由于唯一可用的(显然)包装器是 xgoogle,因此可以选择使用某种浏览器,例如 mechanize,但这会使代码完全依赖于 google HTML,他们可能会对其进行很多更改。

最后的选择是使用谷歌提供的自定义搜索 API,但它有一个每天 100 个请求的限制,以及之后的定价。

我需要关于我应该走哪个方向、您知道哪些其他选择以及哪些对您有用的帮助。

谢谢 !

4

2 回答 2

2

它只需要一个小补丁。

函数 GoogleSearch._extract_result(search.py​​ 的第 237 行)调用 GoogleSearch._extract_description(第 258 行)失败,导致 _extract_result 对于大多数结果返回 None,因此显示的结果少于预期。

使固定:

在 search.py​​ 中,将第 259 行更改为:

desc_div = result.find('div', {'class': re.compile(r'\bs\b')})

对此:

desc_div = result.find('span', {'class': 'st'})

我测试使用:

#!/usr/bin/python
#
# This program does a Google search for "quick and dirty" and returns
# 200 results.
#

from xgoogle.search import GoogleSearch, SearchError

class give_me(object):
    def __init__(self, query, target):
        self.gs = GoogleSearch(query)
        self.gs.results_per_page = 50
        self.current = 0
        self.target = target
        self.buf_list = []

    def __iter__(self):
        return self

    def next(self):
        if self.current >= self.target:
            raise StopIteration
        else:
            if(not self.buf_list):
                self.buf_list = self.gs.get_results()
            self.current += 1
            return self.buf_list.pop(0)

try:
    sites = {}
    for res in give_me("quick and dirty", 200):
        t_dict = \
        {
            "title" : res.title.encode('utf8'),
            "desc" : res.desc.encode('utf8'),
            "url" : res.url.encode('utf8')
        }
        sites[t_dict["url"]] = t_dict
    print t_dict
except SearchError, e:
    print "Search failed: %s" % e
于 2013-07-10T05:52:59.233 回答
1

我想你误解了什么xgoogle是。xgoogle不是包装器它是一个使用浏览器伪装成人类用户并抓取结果的库。截至 2009 年,它严重依赖于 Google 搜索查询和结果页面的格式,因此它在 2013 年的工作方式不同也就不足为奇了。有关更多详细信息,请参阅公告博客文章

当然,您可以破解xgoogle源代码并尝试使其与 Google 当前的格式一起使用(事实证明,它们只是xgoogle偶然损坏,而且不是很严重……),但它只会再次损坏。


同时,您正试图绕过 Google 的服务条款

不要滥用我们的服务。例如,不要干扰我们的服务或尝试使用我们提供的界面和说明以外的方法访问它们。

他们被专门询问了您正在尝试做什么,他们的回答是:

未经 Google 事先明确许可,Google 的服务条款不允许向我们的系统发送任何类型的自动查询。

你甚至说这就是你想要做的:

最后的选择是使用谷歌提供的自定义搜索 API,但它有一个每天 100 个请求的限制,以及之后的定价。

因此,您正在寻找一种方法来使用他们提供的界面以外的方法访问 Google 搜索,以故意绕过他们的免费使用配额而不付费。他们完全有权做任何他们想做的事情来破坏你的代码——如果他们从做某事的人那里得到足够多的点击,他们就会这样做。

(请注意,当程序抓取结果时,没有人会看到广告,而广告是为整个事情付出代价的。)


当然没有人强迫你使用谷歌。EntireWeb 有一个免费的“无限制”(如“只要你不使用太多,而且我们没有指定限制”)搜索 API。必应为您提供更高的配额,并按月而不是按天摊销。雅虎 BOSS 灵活且超便宜(甚至提供“折扣服务器”,如果不够便宜,它会提供较低质量的结果),尽管我相信您不得不输入荒谬的感叹号。如果它们都不适合您……那就为 Google 付费。

于 2013-07-10T01:51:34.620 回答